Existe-t-il un moyen intégré de créer des étiquettes UIL arrondies? Si la réponse est non, comment procéder pour créer un tel objet?
iPhone OS 3.0 et versions ultérieures prennent en charge la propriété cornerRadius
de la classe CALayer
. Chaque vue a une instance CALayer
que vous pouvez manipuler. Cela signifie que vous pouvez obtenir des angles arrondis sur une seule ligne:
view.layer.cornerRadius = 8;
Vous aurez besoin de #import <QuartzCore/QuartzCore.h>
Et de vous connecter au framework QuartzCore pour avoir accès aux en-têtes et aux propriétés de CALayer.
Une façon de le faire, que j’ai utilisée récemment, est de créer une sous-classe UIView qui dessine simplement un rectangle arrondi, puis de transformer UILabel ou, dans mon cas, UITextView, une sous-vue à l’intérieur de celui-ci. Plus précisément:
UIView
et nommez-la sous la forme RoundRectView
.drawRect:
De RoundRectView
, tracez un chemin autour des limites de la vue à l'aide d'appels Core Graphics tels que CGContextAddLineToPoint () pour les arêtes et CGContextAddArcToPoint () pour les angles arrondis.UILabel
et faites-en une sous-vue de RoundRectView.label.frame = CGRectInset(roundRectView.bounds, 8, 8);
)Vous pouvez placer RoundRectView sur une vue à l'aide d'Interface Builder si vous créez un UIView générique, puis modifiez sa classe à l'aide de l'inspecteur. Vous ne verrez le rectangle que lorsque vous aurez compilé et exécuté votre application, mais vous pourrez au moins placer la sous-vue et la connecter à des prises ou à des actions si nécessaire.
Pour les appareils avec iOS 7.1 ou version ultérieure, vous devez ajouter:
yourUILabel.layer.masksToBounds = YES;
yourUILabel.layer.cornerRadius = 8.0;
Pour Swift IOS8 et suivants, en fonction de la réponse OScarsWyck:
yourUILabel.layer.masksToBounds = true
yourUILabel.layer.cornerRadius = 8.0
UILabel
appelé: myLabel
.#import <QuartzCore/QuartzCore.h>
dans votre viewDidLoad
écrivez cette ligne: self.myLabel.layer.cornerRadius = 8;
Bonne chance
Vous pouvez faire une bordure arrondie avec une largeur de bordure de tout contrôle de cette manière: -
CALayer * l1 = [lblName layer];
[l1 setMasksToBounds:YES];
[l1 setCornerRadius:5.0];
// You can even add a border
[l1 setBorderWidth:5.0];
[l1 setBorderColor:[[UIColor darkGrayColor] CGColor]];
Remplacez simplement lblName
par votre UILabel
.
Note: - N'oubliez pas d'importer <QuartzCore/QuartzCore.h>
xCode 7.3.1 iOS 9.3.2
_siteLabel.layer.masksToBounds = true;
_siteLabel.layer.cornerRadius = 8;
Une autre méthode consiste à placer un png derrière UILabel. J'ai des vues avec plusieurs étiquettes qui superposent un seul png d'arrière-plan contenant toutes les illustrations pour les étiquettes individuelles.
J'ai créé une sous-classe Swift UILabel
pour obtenir cet effet. De plus, je règle automatiquement la couleur du texte en noir ou en blanc pour un contraste maximal.
Messages SO utilisés:
Il suffit de coller ceci dans une aire de jeu iOS:
//: Playground - noun: a place where people can play
import UIKit
class PillLabel : UILabel{
@IBInspectable var color = UIColor.lightGrayColor()
@IBInspectable var cornerRadius: CGFloat = 8
@IBInspectable var labelText: String = "None"
@IBInspectable var fontSize: CGFloat = 10.5
// This has to be balanced with the number of spaces prefixed to the text
let borderWidth: CGFloat = 3
init(text: String, color: UIColor = UIColor.lightGrayColor()) {
super.init(frame: CGRectMake(0, 0, 1, 1))
labelText = text
self.color = color
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
func setup(){
// This has to be balanced with the borderWidth property
text = " \(labelText)".uppercaseString
// Credits to https://stackoverflow.com/a/33015915/784318
layer.borderWidth = borderWidth
layer.cornerRadius = cornerRadius
backgroundColor = color
layer.borderColor = color.CGColor
layer.masksToBounds = true
font = UIFont.boldSystemFontOfSize(fontSize)
textColor = color.contrastColor
sizeToFit()
// Credits to https://stackoverflow.com/a/15184257/784318
frame = CGRectInset(self.frame, -borderWidth, -borderWidth)
}
}
extension UIColor {
// Credits to https://stackoverflow.com/a/29044899/784318
func isLight() -> Bool{
var green: CGFloat = 0.0, red: CGFloat = 0.0, blue: CGFloat = 0.0, alpha: CGFloat = 0.0
self.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
let brightness = ((red * 299) + (green * 587) + (blue * 114) ) / 1000
return brightness < 0.5 ? false : true
}
var contrastColor: UIColor{
return self.isLight() ? UIColor.blackColor() : UIColor.whiteColor()
}
}
var label = PillLabel(text: "yellow", color: .yellowColor())
label = PillLabel(text: "green", color: .greenColor())
label = PillLabel(text: "white", color: .whiteColor())
label = PillLabel(text: "black", color: .blackColor())
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
label.text = @"Your String.";
label.layer.cornerRadius = 8.0;
[self.view addSubview:label];
Si vous voulez une étiquette arrondie avec la couleur de fond, en plus de la plupart des autres réponses, vous devez également définir la couleur de fond de layer
. Cela ne fonctionne pas lorsque vous définissez view
couleur d'arrière-plan.
label.layer.cornerRadius = 8
label.layer.masksToBounds = true
label.layer.backgroundColor = UIColor.lightGray.cgColor
Si vous utilisez la mise en page automatique, souhaitez un remplissage autour de l'étiquette et ne souhaitez pas définir la taille de l'étiquette manuellement, vous pouvez créer une sous-classe UILabel et remplacer la propriété intrinsincContentSize
:
class LabelWithPadding: UILabel {
override var intrinsicContentSize: CGSize {
let defaultSize = super.intrinsicContentSize
return CGSize(width: defaultSize.width + 12, height: defaultSize.height + 8)
}
}
Pour combiner les deux, vous devrez également définir label.textAlignment = center
, sinon le texte serait aligné à gauche.
Fonctionne parfaitement dans Swift 2.0
@IBOutlet var theImage: UIImageView! //you can replace this with any UIObject eg: label etc
override func viewDidLoad() {
super.viewDidLoad()
//Make sure the width and height are same
self.theImage.layer.cornerRadius = self.theImage.frame.size.width / 2
self.theImage.layer.borderWidth = 2.0
self.theImage.layer.borderColor = UIColor.whiteColor().CGColor
self.theImage.clipsToBounds = true
}
Fonctionne bien dans Xcode 8.1.2 avec Swift 3, testé au mois d'août 2017
"cornerRadius" est la propriété clé permettant de définir les bords arrondis. Si vous utilisez le même style pour toutes les étiquettes de votre application, je vous le recommande pour une méthode d'extension.
Code:
// extension Class
extension UILabel {
// extension user defined Method
func setRoundEdge() {
let myGreenColor = (UIColor(red: -0.108958, green: 0.714926, blue: 0.758113, alpha: 1.0))
//Width of border
self.layer.borderWidth = 1.0
//How much the Edge to be rounded
self.layer.cornerRadius = 5.0
// following properties are optional
//color for border
self.layer.borderColor = myGreenColor.cgColor
//color for text
self.textColor = UIColor.red
// Mask the bound
self.layer.masksToBounds = true
//clip the pixel contents
self.clipsToBounds = true
}
}
Sortie:
Pourquoi une méthode d'extension?
Créez un fichier Swift et ajoutez le code suivant, qui contient la méthode Extention dans la classe "UILabel". Cette méthode est définie par l'utilisateur mais fonctionne pour tous les libellés de votre application. pour maintenir la cohérence et le code propre, si vous modifiez un style à l'avenir, n'exigez que dans la méthode d'extension.
Dans Monotouch/Xamarin.iOS, j'ai résolu le même problème, comme ceci:
UILabel exampleLabel = new UILabel(new CGRect(0, 0, 100, 50))
{
Text = "Hello Monotouch red label"
};
exampleLabel.Layer.MasksToBounds = true;
exampleLabel.Layer.CornerRadius = 8;
exampleLabel.Layer.BorderColor = UIColor.Red.CGColor;
exampleLabel.Layer.BorderWidth = 2;
Avez-vous essayé d’utiliser le UIButton
du générateur d’interface (dont les angles sont arrondis) et d’essayer avec les paramètres pour lui donner l’apparence d’une étiquette. si tout ce que vous voulez, c'est afficher du texte statique à l'intérieur.
Selon ce que vous faites exactement, vous pouvez créer une image et la définir comme arrière-plan par programmation.