Comment puis-je créer un tour acculé UILabel sur l'iPhone?

voix
139

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?

Créé 04/02/2009 à 08:19
source utilisateur
Dans d'autres langues...                            


16 réponses

voix
223

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:

  1. Créer une UIViewsous - classe et nommez quelque chose comme RoundRectView.
  2. 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.
  3. Créer une UILabelinstance et en faire une sous - vue de la RoundRectView.
  4. 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.

Créé 04/02/2009 à 10:22
source utilisateur

voix
130

Pour les appareils avec iOS 7.1 ou version ultérieure, vous devez ajouter:

yourUILabel.layer.masksToBounds = YES;
yourUILabel.layer.cornerRadius = 8.0;
Créé 04/04/2014 à 08:54
source utilisateur

voix
17

Pour Swift IOS8 partir fonction de la réponse OScarsWyck:

yourUILabel.layer.masksToBounds = true
yourUILabel.layer.cornerRadius = 8.0
Créé 17/08/2015 à 16:08
source utilisateur

voix
11

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>

Créé 13/02/2014 à 09:09
source utilisateur

voix
11
  1. vous avez un UILabelappelé: myLabel.
  2. dans votre fichier « m » ou « h » importation: #import <QuartzCore/QuartzCore.h>
  3. 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

Créé 04/12/2012 à 11:08
source utilisateur

voix
6

Xcode 7.3.1 iOS 9.3.2

 _siteLabel.layer.masksToBounds = true;
  _siteLabel.layer.cornerRadius = 8;
Créé 21/07/2016 à 11:22
source utilisateur

voix
6

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.

Créé 04/02/2009 à 18:24
source utilisateur

voix
4
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
    label.text = @"Your String.";
    label.layer.cornerRadius = 8.0;
    [self.view addSubview:label];
Créé 21/05/2014 à 07:44
source utilisateur

voix
3

Si vous voulez coin arrondi d'objets comme interface utilisateur ( UILabel, UIView, UIButton, UIImageView) par storyboard puis définissez clip to boundstrue et définissez User Defined Runtime Attributeschemin clé comme layer.cornerRadius, type = Nombre et valeur = 9 (comme votre exigence)

Set clip limites que Définir Runtime défini par l'utilisateur attributs

Créé 28/06/2017 à 10:49
source utilisateur

voix
3

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

-couleurs-bordures arrondies

D'occasion SO-Messages:

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())
Créé 30/03/2016 à 14:16
source utilisateur

voix
2

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:

entrez la description d'image ici

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.

Créé 15/08/2017 à 13:25
source utilisateur

voix
2

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;
Créé 14/01/2016 à 14:23
source utilisateur

voix
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.

Créé 09/03/2009 à 21:45
source utilisateur

voix
1

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.

Créé 29/05/2017 à 21:52
source utilisateur

voix
1

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

    }
Créé 16/04/2016 à 22:02
source utilisateur

voix
0

Selon vous ce que vous faites exactement pourrait faire une image et la définir comme l'arrière-plan programatically.

Créé 05/11/2011 à 01:55
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more