2009-08-25 4 views
9

Je ne trouve nulle part (moteurs de recherche, docs, ici, etc) qui montre comment créer des coins arrondis (en particulier dans une vue de tableau groupé) sur un élément qui clips également les sous-vues .UITableViewCell coins arrondis et sous-vues de clip

J'ai un code qui crée correctement un rectangle arrondi sur un chemin avec 4 arcs (les coins arrondis) qui a été testé dans la méthode drawRect: dans ma uitableviewcell sous-classée. Le problème est que les sous-vues, qui se trouvent être des uibuttons avec leurs vues d'images internes, n'obéissent pas au CGContextClip() que la uitableviewcell obéit.

Voici le code:

- (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];  
} 

Parce que ce cas particulier est statique (seulement montre en 1 ligne spécifique de boutons), je peux modifier les images utilisées pour les boutons pour obtenir l'effet désiré.

MAIS, j'ai un autre cas qui est dynamique. Plus précisément, une table groupée avec beaucoup de résultats basés sur la base de données qui montrera les photos qui peuvent être dans la première ou la dernière rangée avec des coins arrondis et doivent donc être découpées).

Donc, est-il possible de créer un CGContextClip() qui arrête aussi les sous-vues? Si c'est le cas, comment?

+0

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

+0

C'est aussi simple ... http://stackoverflow.com/a/20410857/294884 que CLIP TOUS LES SUBVIEWS aussi. – Fattie

Répondre

0

Créer une sous-classe de UIImageView avec coins arrondis et transparence. Le UITableViewCell lui-même devrait être opaque pour de meilleures performances.

Jetez un oeil à this example.

+0

Impossible de tester cela, mais cela semble être une bonne solution moderne – Brenden

7

L'objet CALayer a des fonctions pour les coins arrondis:

UIView * someview = something here; 
CALayer * layer = [someview layer]; 
layer.masksToBounds = YES; 
layer.cornerRadius = radius; 

Et vous êtes tous ensemble. Vous pouvez également ajouter des couleurs de bordure et d'autres choses, consultez les documents au cas où vous êtes intéressé.

+2

Vous ne devriez jamais utiliser le cornerRadius de CALayer dans un UITableViewCell. Son impact sur les performances est beaucoup trop important pour la vitesse à laquelle de telles cellules doivent être dessinées pour avoir une table de défilement rapide. –

+1

Il n'y a aucun moyen d'utiliser ceci pour les tablecells comme le paramètre cornerRadius est pour tous les coins. Il n'y a aucun moyen de faire une cellule arrondie seulement – coneybeare

+0

'view.layer.masksToBounds = YES' et' view.layer.cornerRadius = 8.0f' me donne exactement ce que je recherchais. Merci. –

3

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

Je l'ai utilisé dans plusieurs projets, la performance est grande et il est hautement personnalisable. Il n'utilise pas cornerRadius et le dessin des cellules est contextuel.

+0

Ooh, je ne suis pas sûr que le code adresse votre requête subviews cependant. Code utile pour les tableaux de style de groupe arrondis et sensibles au contexte. –

+0

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

1

Essayez ceci dans votre vue initialiseur:

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

Et vous n'avez pas besoin de mettre en œuvre une méthode drawRect du tout

+0

Cela ne supprime pas les sous-vues UIButton. –

+0

pour que vous deviez aller à l'inspecteur des attributs du bouton dans IB, sous la section Voir, dessin, cochez "Sous-vues du clip" – Zennichimaro

0

(au moins aux fins de la frontière ronde et découpage.) Si vous avez une coutume UITableViewCell vous pouvez le faire à 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 
} 

}

Questions connexes