9
votes

UitablesViewcell arrondi coins et clips Sous-système

Je ne trouve rien nulle part (moteurs de recherche, docs, ici, etc.) qui montre comment créer des coins arrondis (en particulier dans une vue de table groupée) sur un élément qui clipse également les sous-espoirs.

J'ai Code qui crée correctement un rectangle arrondi sur un chemin avec 4 arcs (les coins arrondis) qui ont été testés dans le drawrect: méthode dans mon sous-classement uableviewcell. Le problème est que les sous-visions, qui se produisent des uibuttons avec leurs envies uiimage internes, ne respectent pas le CGContextClip () que l'utableviettexcell obéys. P>

Voici le code: p>

- (void)drawRect:(CGRect)rect
{       
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGFloat radius = 12;
    CGFloat width = CGRectGetWidth(rect);
    CGFloat height = CGRectGetHeight(rect);

    // Make sure corner radius isn't larger than half the shorter side
    if (radius > width/2.0)
        radius = width/2.0;
    if (radius > height/2.0)
        radius = height/2.0;    

    CGFloat minx = CGRectGetMinX(rect) + 10;
    CGFloat midx = CGRectGetMidX(rect);
    CGFloat maxx = CGRectGetMaxX(rect) - 10;
    CGFloat miny = CGRectGetMinY(rect);
    CGFloat midy = CGRectGetMidY(rect);
    CGFloat maxy = CGRectGetMaxY(rect);

    [[UIColor greenColor] set];


    CGContextBeginPath(context);

    CGContextMoveToPoint(context, minx, midy);

    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);

    CGContextClip(context);
    CGContextFillRect(context, rect);

    [super drawRect:rect];    
}


2 commentaires

Il n'y a pas de réponse ici sur la question principale. Est-il possible d'obtenir CGContextClip () pour affecter les sous-visions?


C'est ce ... Stackoverflow.com/a/20410857/294884 qui clipsera toutes les sous-espions également.


5 Réponses :


0
votes

Créer une sous-classe de UiImageView avec des coins arrondis et une transparence. Le utableviewCell doit être opaque pour une meilleure performance.

regarder Cet exemple .


0 commentaires

7
votes

L'objet Calayer a des fonctions pour arrondir les coins: xxx

et vous êtes tous définis. Vous pouvez également ajouter des couleurs et des trucs de frontière, consultez les docs au cas où vous êtes intéressé.


5 commentaires

Vous ne devriez jamais utiliser Calayer Cornerradius dans un UitailViewCell. Sa performance HIT est beaucoup trop grande pour que ces cellules soient dessinées pour avoir une table de défilement rapide.


Il n'ya aucun moyen d'utiliser cela pour les nappes car le paramètre Cornerradius est pour tous les coins. Il n'y a aucun moyen de faire une seule cellule arrondie


vue.layer.maskstobounds = YES et vue.layer.cornerradius = 8.0f me donne exactement ce que j'étais après. Merci.


Le compilateur se plaint que Calayer n'a pas de propriété Cornerradius à moins que vous importiez . Et pourtant, il reconnaît la classe elle-même.


@OSCAR - C'est parce que la référence Calayer dans uIView.h est juste une référence de classe avant. Voir la ligne 81 (dans la 6.1 SDK, de toute façon).



3
votes

Voir ce code: http://gist.github.com/292384

Je l'ai utilisé dans plusieurs projets, la performance est excellente et elle est hautement personnalisable. Il n'utilise pas Cornerradius et le dessin des cellules est sensible au contexte.


2 commentaires

OOH, je ne suis pas sûr que le code aborde votre requête Sous-Views. Code utile pour des tables de style de groupe arrondies sensibles au contexte.


Merci pour cela! C'est juste ce que je cherchais.



2
votes

Essayez ceci à votre avis Initialiseur:

self.layer.borderWidth = 2.0f;
self.layer.borderColor = [[UIColor greenColor] CGColor];
self.layer.masksToBounds = YES;
self.layer.cornerRadius = 12.0f;


2 commentaires

Cela ne clipse pas sous-visions d'UIButton.


Pour cela, vous devez aller à l'inspecteur des attributs du bouton dans IB, sous la section Vue, dessin, cocher "Sous-Sous-Sous-Sudviews"



0
votes

Si vous avez un utableviewCell personnalisé, vous pouvez le faire dans SWIFT 4.0:

class CustomTVC: UITableViewCell {

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    self.layer.cornerRadius = 20
    self.layer.masksToBounds = true
}


0 commentaires