16 ответов:
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.- установите рамку метки в виде нескольких пикселей, вставленных в границы 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
- у вас
UILabelпод названием:myLabel.- в вашем файле" m "или" h " импорт:
#import <QuartzCore/QuartzCore.h>в своем
viewDidLoadвведите следующую строку:self.myLabel.layer.cornerRadius = 8;
- зависит от того, как вы хотите, вы можете изменить значение cornerRadius с 8 на другое число :)
удачи
вы можете сделать закругленную границу с шириной границы любого контроля таким образом: -
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>
другой метод заключается в размещении 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подкласс для достижения этого эффекта. Кроме того, я автоматически установить цвет текста на черный или белый для максимального контраста.результат
используется так-Сообщения:
- как нарисовать границу вокруг UILabel?
- добавить границу за пределами UIView
- проверьте, является ли UIColor темным или яркий?
детская площадка
просто вставьте это в 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())
В 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;
отлично работает в 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 }
вы пробовали использовать
UIButtonиз конструктора интерфейса (который имеет закругленные углы) и экспериментирует с настройками, чтобы сделать его похожим на метку. если все, что вы хотите, чтобы отобразить статический текст внутри.
отлично работает в 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", где этот метод определен пользователем, но будет работать для всех меток в вашем приложении и поможет поддерживать согласованность и чистый код, если вы измените какой-либо стиль в будущем требуется только в методе расширения.
Swift 3
если вы хотите закругленную метку с цветом фона, в дополнение к большинству других ответов, вам нужно установить
layer'ы цвет фона, а также. Он не работает при установкеviewцвет фона.label.layer.cornerRadius = 8 label.layer.masksToBounds = true label.layer.backgroundColor = UIColor.lightGray.cgColorесли вы используете auto layout, хотите, чтобы некоторые отступы вокруг метки и не хотите устанавливать размер метки вручную, вы можете создать подкласс 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, иначе текст будет выровнен по левому краю.
в зависимости от того, что именно вы делаете, вы можете сделать изображение и установить его в качестве фона программно.




Comments