Hvordan lager jeg en runde har cornered UILabel på iPhone?

stemmer
141

Er det en innebygd måte å lage runde hjørner UILabels? Hvis svaret er nei, hvordan vil man gå om å skape et slikt objekt?

Publisert på 04/02/2009 klokken 07:19
kilden bruker
På andre språk...                            


16 svar

stemmer
224

iOS 3.0 og nyere

iPhone OS 3.0 og senere støtter cornerRadiuseiendom på CALayerklassen. Hver visning har et CALayereksempel som du kan manipulere. Dette betyr at du kan få avrundede hjørner i en linje:

view.layer.cornerRadius = 8;

Du må #import <QuartzCore/QuartzCore.h>og link til QuartzCore rammeverk for å få tilgang til CALayer er overskrifter og egenskaper.

Før iOS 3.0

En måte å gjøre det på, som jeg brukte nylig, er å skape et UIView underklasse som bare trekker et avrundet rektangel, og deretter gjøre UILabel eller i mitt tilfelle, UITextView, en subview innsiden av det. Nærmere bestemt:

  1. Lag en UIViewunderklasse og gi den navnet noe sånt RoundRectView.
  2. I RoundRectView's drawRect:metode, trekke en bane rundt grensene for visning ved hjelp av kjerne Graphics kaller som CGContextAddLineToPoint () for kantene og og CGContextAddArcToPoint () for de avrundede hjørner.
  3. Opprett en UILabelforekomst og gjøre det til en subview av RoundRectView.
  4. Sett rammen av etiketten for å være noen få piksler innsatt av RoundRectView er grenser. (For eksempel, label.frame = CGRectInset(roundRectView.bounds, 8, 8);)

Du kan plassere RoundRectView på en visning ved hjelp Interface Builder hvis du oppretter en generisk UIView og deretter endre sin klasse med inspektør. Du vil ikke se rektangelet før du kompilere og kjøre programmet ditt, men minst vil du være i stand til å plassere subview og koble den til utsalgssteder eller handlinger hvis nødvendig.

Svarte 04/02/2009 kl. 09:22
kilden bruker

stemmer
132

For enheter med iOS 7.1 eller senere, må du legge til:

yourUILabel.layer.masksToBounds = YES;
yourUILabel.layer.cornerRadius = 8.0;
Svarte 04/04/2014 kl. 07:54
kilden bruker

stemmer
17

For Swift iOS8 fremover basert på OScarsWyck svar:

yourUILabel.layer.masksToBounds = true
yourUILabel.layer.cornerRadius = 8.0
Svarte 17/08/2015 kl. 16:08
kilden bruker

stemmer
11

Du kan lage avrundet kant med bredde på grensen til noen kontroll på denne måten: -

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


Bare erstatte lblNamemed UILabel.

Merk: - Ikke glem å importere<QuartzCore/QuartzCore.h>

Svarte 13/02/2014 kl. 08:09
kilden bruker

stemmer
11
  1. du har en UILabelsom heter: myLabel.
  2. i "m" eller "h" file import: #import <QuartzCore/QuartzCore.h>
  3. i viewDidLoadskrive denne linjen:self.myLabel.layer.cornerRadius = 8;

    • avhenger av hvordan du ønsker kan du endre cornerRadius verdi fra 8 til annet nummer :)

Lykke til

Svarte 04/12/2012 kl. 10:08
kilden bruker

stemmer
6

XCode 7.3.1 iOS 9.3.2

 _siteLabel.layer.masksToBounds = true;
  _siteLabel.layer.cornerRadius = 8;
Svarte 21/07/2016 kl. 11:22
kilden bruker

stemmer
6

En annen metode er å plassere en PNG bak UILabel. Jeg har synspunkter med flere etiketter som legges over en enkelt bakgrunn png som har alle kunstverk for de enkelte etiketter.

Svarte 04/02/2009 kl. 17:24
kilden bruker

stemmer
4

Jeg gjorde en rask UILabelunderklasse å oppnå denne effekten. I tillegg setter jeg automatisk tekstfarge til enten svart eller hvitt for maksimal kontrast.

Resultat

farger avrundet-grenser

Brukte SO-innlegg:

Lekeplass

Bare lim dette inn i en 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())
Svarte 30/03/2016 kl. 14:16
kilden bruker

stemmer
4
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
    label.text = @"Your String.";
    label.layer.cornerRadius = 8.0;
    [self.view addSubview:label];
Svarte 21/05/2014 kl. 06:44
kilden bruker

stemmer
3

Hvis du ønsker avrundet hjørne av UI objekter som ( UILabel, UIView, UIButton, UIImageView) ved dreieboken og deretter sette clip to boundssant og satt User Defined Runtime AttributesKey bane som layer.cornerRadius, type = Antall og verdi = 9 (som krav)

Sett klippet til grensene som Set User Defined Runtime attributter som

Svarte 28/06/2017 kl. 10:49
kilden bruker

stemmer
2

Fungerer fint i Xcode 8.1.2 med Swift 3, Testet under august 2017

"CornerRadius" er nøkkelen eiendom for å stille de avrundede kantene, der hvis du bruker samme stil for alle etikettene i søknaden din, vil jeg anbefale for en utvidelse metode.

Kode:

 // 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
    }
}

Produksjon:

skriv bildebeskrivelse her

Hvorfor Extension metoden?

Lag en Swift-fil og legge til følgende kode, som har Extention metoden til "UILabel" class, der denne metoden er brukerdefinert, men vil fungere for alle etiketten i din søknad og vil bidra til å opprettholde konsistens og ren kode, hvis du endre noen stil i fremtiden krever bare i forlengelsen metoden.

Svarte 15/08/2017 kl. 13:25
kilden bruker

stemmer
2

Fungerer perfekt i 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

    }
Svarte 16/04/2016 kl. 22:02
kilden bruker

stemmer
2

I Mono / Xamarin.iOS jeg løste det samme problemet som dette:

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;
Svarte 14/01/2016 kl. 14:23
kilden bruker

stemmer
2

Visste du prøve å bruke UIButtonfra Interface Builder (som har avrundede hjørner) og eksperimentere med innstillingene for å gjøre det ser ut som en etikett. hvis alt du ønsker er å vise statisk tekst innenfor.

Svarte 09/03/2009 kl. 20:45
kilden bruker

stemmer
1

Swift 3

Hvis du ønsker avrundet etikett med bakgrunnsfarge, i tillegg til de fleste av de andre svarene, må du angi layer's bakgrunnsfarge også. Det fungerer ikke når du setter viewbakgrunnsfarge.

label.layer.cornerRadius = 8
label.layer.masksToBounds = true
label.layer.backgroundColor = UIColor.lightGray.cgColor

Hvis du bruker autooppsettet, vil ha litt polstring rundt etiketten og ønsker ikke å angi størrelsen på etiketten manuelt, kan du opprette UILabel underklasse og overstyre intrinsincContentSizeeiendom:

class LabelWithPadding: UILabel {
    override var intrinsicContentSize: CGSize {
        let defaultSize = super.intrinsicContentSize
        return CGSize(width: defaultSize.width + 12, height: defaultSize.height + 8)
    }
}

Å kombinere de to vil du også må stille label.textAlignment = center, ellers teksten ville stå på linje.

Svarte 29/05/2017 kl. 21:52
kilden bruker

stemmer
0

Avhengig av hva du gjør kan du lage et bilde og sette det som bakgrunn auto.

Svarte 05/11/2011 kl. 00:55
kilden bruker

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