Answers:
iPhone OS 3.0及更高版本支持该类的cornerRadius
属性CALayer
。每个视图都有一个CALayer
您可以操纵的实例。这意味着您可以在一行中获得圆角:
view.layer.cornerRadius = 8;
您将需要#import <QuartzCore/QuartzCore.h>
并链接到QuartzCore框架才能访问CALayer的标头和属性。
我最近使用的一种实现方法是创建一个UIView子类,该子类仅绘制一个圆角矩形,然后在其内部创建UILabel或UITextView(以我为例)。特别:
UIView
子类并将其命名为RoundRectView
。RoundRectView
的drawRect:
方法中,使用Core Graphics调用(如CGContextAddLineToPoint()绘制边缘和CGContextAddArcToPoint()绘制圆角)在视图边界周围绘制路径。UILabel
实例并使其成为RoundRectView的子视图。label.frame = CGRectInset(roundRectView.bounds, 8, 8);
)如果创建通用的UIView,然后使用检查器更改其类,则可以使用Interface Builder将RoundRectView放置在视图上。在编译并运行应用程序之前,您不会看到该矩形,但是至少可以放置子视图并将其连接到插座或操作(如果需要)。
对于基于OScarsWyck的Swift IOS8及更高版本,请回答:
yourUILabel.layer.masksToBounds = true
yourUILabel.layer.cornerRadius = 8.0
YES
来true
。
您可以通过这种方式制作带有任何控件的边框宽度的圆形边框:
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
子类来达到这种效果。另外,我自动将文本颜色设置为黑色或白色,以实现最大的对比度。
二手SO帖子:
只需将其粘贴到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())
xCode 7.3.1 iOS 9.3.2
_siteLabel.layer.masksToBounds = true;
_siteLabel.layer.cornerRadius = 8;
如果你想UI的圆角对象,如(UILabel
,UIView
,UIButton
,UIImageView
)的故事板再设置clip to bounds
正确,并设置User Defined Runtime Attributes
为关键路径
layer.cornerRadius
,类型=数字和值= 9(根据您的要求)
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
label.text = @"Your String.";
label.layer.cornerRadius = 8.0;
[self.view addSubview:label];
如果您想要带有背景颜色的圆角标签,除了大多数其他答案外,还需要设置layer
的背景颜色。设置view
背景色时不起作用。
label.layer.cornerRadius = 8
label.layer.masksToBounds = true
label.layer.backgroundColor = UIColor.lightGray.cgColor
如果使用自动布局,想要在标签周围添加一些填充并且不想手动设置标签的大小,则可以创建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
,否则文本将保持对齐。
在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
}
在Swift 3的Xcode 8.1.2中正常工作,于2017年8月进行了测试
“ 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”类中添加以下代码,该代码具有Extention方法,该方法是用户定义的,但适用于应用程序中的所有标签,并且有助于保持一致性和简洁的代码(如果您使用将来更改任何样式仅需要使用扩展方法。