2012-01-27 1 views
4

Je sais que dans iOS 3.0+ je peux utiliserComment arrondir uniquement les deux premiers coins d'un UILabel?

label.layer.cornerRadius = xxx; 

pour arrondir les quatre coins d'un UILabel (comme une sous-classe UIView), mais je veux seulement arrondir les deux coins supérieurs de l'étiquette et de garder la coins inférieurs à angle droit.

Y at-il un moyen de le faire avec un UILabel? D'autres solutions supposent un UIView personnalisé, pas un UILabel.

Répondre

16

Vous pouvez le faire en utilisant CALayers et masques

CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
maskLayer.path = maskPath.CGPath; 
label.layer.mask = maskLayer; 

où maskPath est un UIBezierPath mis en place à l'aide bezierPathWithRoundedRect:byRoundingCorners:cornerRadii

+0

cool, appris une nouvelle approche ... –

+0

je pense qu'il devrait être label.layer.mask = maskLayer – Anand

+0

@Anand correct, édité – wattson12

1

J'ai vérifié la référence de classe pour UIView & UILabel et ses couches, mais je n'ai trouvé aucun moyen de le faire avec les moyens donnés par l'iOS.

Vous pouvez faire une chose, créer un UIView & appliquer des coins arrondis à elle. Maintenant, ajoutez un UILabel en tant que sous-vue à ce UIView & positionnez-le de sorte que les 2 coins arrondis du bas soient couverts par l'étiquette. De cette façon, vous obtenez l'effet dont vous avez besoin ...

+0

et assurez-vous que UIView et UILabel ont la même couleur. – chatur

+0

ofcourse, c'est un donné. sinon le tell est facilement visible ... –

25

Je pensais que je posterais le code complet avec le BezierPath inclus.

CGRect bounds = label.bounds; 
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds 
                    byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight) 
                     cornerRadii:CGSizeMake(5.0, 5.0)]; 

CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
maskLayer.frame = bounds; 
maskLayer.path = maskPath.CGPath; 

label.layer.mask = maskLayer; 

Swift 4.0:

let bounds: CGRect = label.bounds 
let maskPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: ([.topLeft, .topRight]), cornerRadii: CGSize(width: 5.0, height: 5.0)) 
let maskLayer = CAShapeLayer() 
maskLayer.frame = bounds 
maskLayer.path = maskPath.cgPath 
label.layer.mask = maskLayer 
Questions connexes