Est-il construit de manière à créer UILabels coins ronds? Si la réponse est non, comment peut-on aller sur la création d'un tel objet?
Comment puis-je créer un tour acculé UILabel sur l'iPhone?
iOS 3.0 et versions ultérieures
iPhone OS 3.0 et prend en charge plus tard , la cornerRadiuspropriété de la CALayerclasse. Chaque vue a une CALayerinstance que vous pouvez manipuler. Cela signifie que vous pouvez obtenir des coins arrondis en une ligne:
view.layer.cornerRadius = 8;
Vous devrez #import <QuartzCore/QuartzCore.h>et un lien vers le cadre QuartzCore pour obtenir l' accès aux en- têtes de CALayer et propriétés.
Avant iOS 3.0
Une façon de le faire, que je récemment, est de créer une sous-classe UIView qui dessine simplement un rectangle arrondi, puis faire le UILabel ou, dans mon cas, UITextView, un sous-vue à l'intérieur de celui-ci. Plus précisément:
- Créer une
UIViewsous - classe et nommez quelque chose commeRoundRectView. - Dans
RoundRectViewl »drawRect:procédé, tracer une trajectoire autour des limites de l'affichage à l' aide des appels de base graphique comme CGContextAddLineToPoint () pour les bords et CGContextAddArcToPoint et () pour les angles arrondis. - Créer une
UILabelinstance et en faire une sous - vue de la RoundRectView. - Réglez le cadre de l'étiquette à quelques pixels encart de la des limites de l'RoundRectView. (Par exemple,
label.frame = CGRectInset(roundRectView.bounds, 8, 8);)
Vous pouvez placer le RoundRectView sur une vue à l'aide d'Interface Builder si vous créez un UIView générique puis changer sa classe à l'aide de l'inspecteur. Vous ne verrez pas le rectangle jusqu'à ce que vous compilez et exécutez votre application, mais au moins vous serez en mesure de placer le sous-vue et le connecter à des prises ou des actions en cas de besoin.
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 partir fonction de la réponse OScarsWyck:
yourUILabel.layer.masksToBounds = true
yourUILabel.layer.cornerRadius = 8.0
Vous pouvez faire des bords arrondis avec une largeur de frontière de tout contrôle de la façon suivante: -
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]];
Il suffit de remplacer lblNamevotre UILabel.
Remarque: - Ne pas oublier d'importer<QuartzCore/QuartzCore.h>
- vous avez un
UILabelappelé:myLabel. - dans votre fichier « m » ou « h » importation:
#import <QuartzCore/QuartzCore.h> dans votre
viewDidLoadécriture cette ligne:self.myLabel.layer.cornerRadius = 8;- dépend de la façon dont vous voulez, vous pouvez modifier la valeur cornerRadius de 8 à un autre numéro :)
Bonne chance
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 le UILabel. J'ai vues avec plusieurs étiquettes qui recouvrent une seule .png de fond qui a toutes les illustrations pour les étiquettes individuelles.
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
label.text = @"Your String.";
label.layer.cornerRadius = 8.0;
[self.view addSubview:label];
J'ai fait une rapide UILabelsous - classe pour obtenir cet effet. En outre , je mets automatiquement la couleur du texte soit noir ou blanc pour un contraste maximal.
Résultat
D'occasion SO-Messages:
- Comment dessiner une bordure autour UILabel?
- Ajouter une bordure à l'extérieur d'un UIView
- Vérifiez si UIColor est sombre ou lumineux?
Cour de récréation
Il suffit de coller cela dans un iOS Playground:
//: 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())
Fonctionne très bien dans Xcode 8.1.2 avec Swift 3, testé au cours août 2017
« CornerRadius » est la propriété clé pour définir les bords arrondis, où si vous utilisez le même style pour toutes les étiquettes dans votre application, je recommande 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 Méthode d'extension?
Créez un fichier Swift et ajoutez le code suivant, qui a la méthode Extention à la classe « UILabel », où cette méthode est définie par l'utilisateur, mais fonctionnera pour toutes les étiquettes dans votre application et vous aidera à maintenir la cohérence et du code propre, si vous changer tous les styles à l'avenir exigent que dans la méthode d'extension.
Dans MonoTouch / Xamarin.iOS J'ai résolu le même problème comme celui-ci:
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é en utilisant le UIButtondu constructeur d'interface (qui a des coins arrondis) et d' expérimenter avec les paramètres pour la faire ressembler à une étiquette. si vous voulez simplement d'afficher du texte statique dans.
Swift 3
Si vous voulez l' étiquette arrondie avec la couleur d'arrière - plan, en plus de la plupart des autres réponses, vous devez définir layerainsi de » la couleur d'arrière - plan. Il ne fonctionne pas lorsque la mise en viewcouleur de fond.
label.layer.cornerRadius = 8
label.layer.masksToBounds = true
label.layer.backgroundColor = UIColor.lightGray.cgColor
Si vous utilisez la mise en page automatique, veulent un peu de rembourrage autour de l'étiquette et ne veulent pas définir la taille de l'étiquette manuellement, vous pouvez créer la sous - classe UILabel et passer outre la intrinsincContentSizepropriété:
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 aurez également besoin de définir label.textAlignment = center, sinon le texte sera aligné à gauche.
Fonctionne parfaitement à 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
}
Selon vous ce que vous faites exactement pourrait faire une image et la définir comme l'arrière-plan programatically.

















