Er det en innebygd måte å lage runde hjørner UILabels? Hvis svaret er nei, hvordan vil man gå om å skape et slikt objekt?
Hvordan lager jeg en runde har cornered UILabel på iPhone?
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:
- Lag en
UIViewunderklasse og gi den navnet noe såntRoundRectView. - I
RoundRectView'sdrawRect: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. - Opprett en
UILabelforekomst og gjøre det til en subview av RoundRectView. - 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.
For enheter med iOS 7.1 eller senere, må du legge til:
yourUILabel.layer.masksToBounds = YES;
yourUILabel.layer.cornerRadius = 8.0;
For Swift iOS8 fremover basert på OScarsWyck svar:
yourUILabel.layer.masksToBounds = true
yourUILabel.layer.cornerRadius = 8.0
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>
- du har en
UILabelsom heter:myLabel. - i "m" eller "h" file import:
#import <QuartzCore/QuartzCore.h> 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
XCode 7.3.1 iOS 9.3.2
_siteLabel.layer.masksToBounds = true;
_siteLabel.layer.cornerRadius = 8;
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.
Jeg gjorde en rask UILabelunderklasse å oppnå denne effekten. I tillegg setter jeg automatisk tekstfarge til enten svart eller hvitt for maksimal kontrast.
Resultat
Brukte SO-innlegg:
- Hvordan tegne ramme rundt et UILabel?
- Legge til en ramme utenfor en UIView
- Sjekk om UIColor er mørk eller lys?
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())
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
label.text = @"Your String.";
label.layer.cornerRadius = 8.0;
[self.view addSubview:label];
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:
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.
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
}
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;
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.
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.
Avhengig av hva du gjør kan du lage et bilde og sette det som bakgrunn auto.

















