Υπάρχει ένα ενσωματωμένο στο δρόμο για να δημιουργήσει γύρω από γωνίες UILabels; Εάν η απάντηση δεν είναι, πώς το ένα θα πάει για τη δημιουργία ενός τέτοιου αντικειμένου;
Πώς μπορώ να δημιουργήσω ένα στρογγυλό στρίμωξε UILabel για το iPhone;
iOS 3.0 και αργότερα
iPhone OS 3.0 και νεότερες υποστηρίζει το cornerRadiusακίνητο στην CALayerτάξη. Κάθε άποψη έχει ένα CALayerπαράδειγμα που μπορείτε να χειριστείτε. Αυτό σημαίνει ότι μπορείτε να πάρετε στρογγυλεμένες γωνίες σε μία γραμμή:
view.layer.cornerRadius = 8;
Θα χρειαστεί να #import <QuartzCore/QuartzCore.h>και σύνδεση με το πλαίσιο QuartzCore να αποκτήσετε πρόσβαση σε κεφαλίδες και τις ιδιότητες CALayer του.
Πριν iOS 3.0
Ένας τρόπος για να το κάνουμε, το οποίο θα χρησιμοποιηθεί πρόσφατα, είναι να δημιουργηθεί μια υποκατηγορία UIView η οποία αντλεί απλώς ένα στρογγυλεμένο ορθογώνιο, και στη συνέχεια να κάνουν την UILabel ή, στη δική μου περίπτωση, UITextView, μια δευτερεύουσας προβολής μέσα από αυτό. ΕΙΔΙΚΑ:
- Δημιουργήστε μια
UIViewυποκατηγορία και το όνομα κάτι σανRoundRectView. - Στο
RoundRectView«sdrawRect:μέθοδο, να σχεδιάσετε μια διαδρομή γύρω από τα όρια της άποψης που χρησιμοποιούν πυρήνα γραφικών καλεί όπως CGContextAddLineToPoint () για τις άκρες και και CGContextAddArcToPoint () για τις στρογγυλεμένες γωνίες. - Δημιουργήστε ένα
UILabelπαράδειγμα και να κάνουν ένα δευτερεύουσας προβολής του RoundRectView. - Ορίστε το πλαίσιο της ετικέτας είναι μερικά pixels ένθετο των ορίων του RoundRectView του. (Για παράδειγμα,
label.frame = CGRectInset(roundRectView.bounds, 8, 8);)
Μπορείτε να τοποθετήσετε το RoundRectView σε μια προβολή με τη χρήση Interface Builder, εάν δημιουργήσετε μια γενική UIView και στη συνέχεια να αλλάξετε κατηγορία του με τη χρήση του επιθεωρητή. Δεν θα δείτε το ορθογώνιο μέχρι να καταρτίζουν και να τρέξει η εφαρμογή σας, αλλά τουλάχιστον θα είστε σε θέση να τοποθετήσετε το δευτερεύουσας προβολής και συνδέστε το με καταστήματα ή ενέργειες, αν χρειαστεί.
Για συσκευές με iOS 7.1 ή νεότερη έκδοση, θα πρέπει να προσθέσετε:
yourUILabel.layer.masksToBounds = YES;
yourUILabel.layer.cornerRadius = 8.0;
Για Swift iOS8 και μετά με βάση OScarsWyck απάντηση:
yourUILabel.layer.masksToBounds = true
yourUILabel.layer.cornerRadius = 8.0
Μπορείτε να κάνετε στρογγυλεμένες σύνορα με το πλάτος των συνόρων κάθε έλεγχο με αυτόν τον τρόπο: -
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]];
Απλά αντικαταστήστε lblNameμε σας UILabel.
Σημείωση: - Μην ξεχάσετε να εισάγετε<QuartzCore/QuartzCore.h>
- έχετε ένα
UILabelπου ονομάζεται:myLabel. - σε «m» ή «η» εισαγωγή του αρχείου σας:
#import <QuartzCore/QuartzCore.h> που σου
viewDidLoadγράφουν αυτή τη γραμμή:self.myLabel.layer.cornerRadius = 8;- εξαρτάται από το πόσο θέλετε μπορείτε να αλλάξετε την αξία cornerRadius από 8 έως άλλον αριθμό :)
Καλή τύχη
Xcode 7.3.1 iOS 9.3.2
_siteLabel.layer.masksToBounds = true;
_siteLabel.layer.cornerRadius = 8;
Μια άλλη μέθοδος είναι να τοποθετήσετε ένα png πίσω από το UILabel. Έχω απόψεων με αρκετές ετικέτες που επικαλύπτουν ένα ενιαίο πλαίσιο png, που έχει όλα τα έργα τέχνης για τις μεμονωμένες ετικέτες.
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
label.text = @"Your String.";
label.layer.cornerRadius = 8.0;
[self.view addSubview:label];
Έκανα μια γρήγορη UILabelυποκατηγορία για να επιτευχθεί αυτό το αποτέλεσμα. Επιπλέον, θα ρυθμίζεται αυτόματα το χρώμα του κειμένου σε μαύρο ή λευκό για μέγιστη αντίθεση.
Αποτέλεσμα
Χρησιμοποιείται SO-Δημοσιεύσεις:
- Πώς να επιστήσω σύνορα γύρω από ένα UILabel;
- Προσθέστε ένα περίγραμμα έξω από ένα UIView
- Ελέγξτε αν UIColor είναι σκοτεινό ή φωτεινό;
Παιδική χαρά
Απλά επικολλήστε αυτό σε 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())
Δουλεύει καλά σε Xcode 8.1.2 με Swift 3, Δοκιμασμένο κατά τη διάρκεια Αυγ 2017
«CornerRadius» είναι η βασική ιδιότητα για να ορίσετε τις στρογγυλεμένες άκρες, όπου και αν χρησιμοποιείτε το ίδιο στυλ για όλες τις ετικέτες στην εφαρμογή σας, θα ήθελα να συστήσω για μια μέθοδο επέκτασης.
Κώδικας:
// 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
}
}
Παραγωγή:
Γιατί μέθοδο επέκτασης;
Δημιουργήστε ένα αρχείο Swift και προσθέστε τον ακόλουθο κώδικα, το οποίο έχει την μέθοδο Παράταση στην κατηγορία «UILabel», όπου η μέθοδος αυτή ορίζει ο χρήστης, αλλά θα λειτουργήσει για όλη την ετικέτα στην εφαρμογή σας και θα σας βοηθήσει να διατηρηθεί η συνοχή και καθαρό κώδικα, που αν αλλάζουν κάθε στυλ στο μέλλον να απαιτούν μόνο στη μέθοδο επέκτασης.
Σε MonoTouch / Xamarin.iOS Έλυσα το ίδιο πρόβλημα όπως αυτό:
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;
Μήπως δοκιμάστε να χρησιμοποιήσετε το UIButtonαπό τον κατασκευαστή Interface (που έχει στρογγυλεμένες γωνίες) και τον πειραματισμό με τις ρυθμίσεις για να φανεί σαν μια ετικέτα. αν το μόνο που θέλετε είναι να εμφανίσετε στατικό κείμενο μέσα.
Swift 3
Αν θέλετε στρογγυλεμένες ετικέτα με το χρώμα του φόντου, εκτός από τις περισσότερες από τις άλλες απαντήσεις, θα πρέπει να ρυθμίσετε layer«s χρώμα του φόντου, καθώς και. Δεν λειτουργεί κατά τον καθορισμό viewχρώμα του φόντου.
label.layer.cornerRadius = 8
label.layer.masksToBounds = true
label.layer.backgroundColor = UIColor.lightGray.cgColor
Εάν χρησιμοποιείτε διάταξη αυτοκινήτων, θέλουν κάποιο padding γύρω από την ετικέτα και δεν θέλετε να ορίσετε το μέγεθος της ετικέτας με μη αυτόματο τρόπο, μπορείτε να δημιουργήσετε UILabel υποκατηγορία και να παρακάμψετε intrinsincContentSizeτο ακίνητο:
class LabelWithPadding: UILabel {
override var intrinsicContentSize: CGSize {
let defaultSize = super.intrinsicContentSize
return CGSize(width: defaultSize.width + 12, height: defaultSize.height + 8)
}
}
Για να συνδυάσετε τα δύο θα πρέπει, επίσης, να ρυθμίσετε label.textAlignment = center, διαφορετικά το κείμενο θα πρέπει να έχουν αριστερή στοίχιση.
Λειτουργεί τέλεια σε 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
}
Ανάλογα με το τι ακριβώς θα κάνεις θα μπορούσε να κάνει μια εικόνα και να την ορίσετε ως φόντο κάποιου προγράμματος.

















