我在检查器中看到我可以改变背景颜色,但是我想改变边框的颜色和粗细,可以吗?
你需要使用视图层来设置边界属性。例句:
#import <QuartzCore/QuartzCore.h> ... view.layer.borderColor = [UIColor redColor].CGColor; view.layer.borderWidth = 3.0f;
你还需要链接到QuartzCore.framework来访问这个功能。
你也可以创建边界的颜色你的愿望..
view.layer.borderColor = [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0].CGColor;
*r,g,b是0到255之间的值。
如果你想在不同的边线上添加不同的边框,可能添加一个带有特定样式的子视图是一种容易想出的方法。
当我使用Vladimir的CALayer解决方案时,在视图的顶部我有一个动画,像一个模态UINavigationController解散,我看到很多故障发生,并有绘图性能问题。
所以,另一种实现这一点的方法,但没有故障和性能损失,是创建一个自定义UIView,并像这样实现drawRect消息:
drawRect
- (void)drawRect:(CGRect)rect { CGContextRef contextRef = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(contextRef, 1); CGContextSetRGBStrokeColor(contextRef, 255.0, 255.0, 255.0, 1.0); CGContextStrokeRect(contextRef, rect); }
如果你不想编辑UIView的层,你总是可以将视图嵌入到另一个视图中。父视图将其背景颜色设置为边框颜色。它也会稍微大一点,这取决于你想要的边界有多宽。
当然,这只适用于你的视图不是透明的,你只想要一个单一的边界颜色。OP希望在视图本身的边界,但这可能是一个可行的替代方案。
我不建议重写drawRect,因为这会导致性能下降。
相反,我将修改类的属性如下(在你的自定义uiview):
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.layer.borderWidth = 2.f; self.layer.borderColor = [UIColor redColor].CGColor; } return self;
当采用上述方法时,我没有看到任何故障-不确定为什么放入initWithFrame会停止这些;-)
由于Xcode的最新版本有一个更好的解决方案:
使用@IBInspectable,你可以直接从在和Attributes Inspector设置属性。
@IBInspectable
Attributes Inspector
这为你设置了User Defined Runtime Attributes:
User Defined Runtime Attributes
有两种方法可以设置:
选项1(在Storyboard中实时更新)
MyCustomView
UIView
@IBDesignable
`
@IBDesignable class MyCustomView: UIView { @IBInspectable var cornerRadius: CGFloat = 0 { didSet { layer.cornerRadius = cornerRadius layer.masksToBounds = cornerRadius > 0 } } @IBInspectable var borderWidth: CGFloat = 0 { didSet { layer.borderWidth = borderWidth } } @IBInspectable var borderColor: UIColor? { didSet { layer.borderColor = borderColor?.CGColor } } }
* @IBDesignable只在class MyCustomView的开头设置时有效
class MyCustomView
选项2(从Swift 1.2开始就不工作了,见评论)
扩展你的UIView类:
extension UIView { @IBInspectable var cornerRadius: CGFloat = 0 { didSet { layer.cornerRadius = cornerRadius layer.masksToBounds = cornerRadius > 0 } } @IBInspectable var borderWidth: CGFloat = 0 { didSet { layer.borderWidth = borderWidth } } @IBInspectable var borderColor: UIColor? { didSet { layer.borderColor = borderColor?.CGColor } } }
MycustomView
我想把这个添加到@marczking的答案(选项1)作为评论,但我在StackOverflow上的低级状态阻止了这一点。
我把@marczking对Objective c的回答做了一个移植,非常有魅力,谢谢@marczking!
UIView + Border.h:
#import <UIKit/UIKit.h> IB_DESIGNABLE @interface UIView (Border) -(void)setBorderColor:(UIColor *)color; -(void)setBorderWidth:(CGFloat)width; -(void)setCornerRadius:(CGFloat)radius; @end
UIView + Border.m:
#import "UIView+Border.h" @implementation UIView (Border) // Note: cannot use synthesize in a Category -(void)setBorderColor:(UIColor *)color { self.layer.borderColor = color.CGColor; } -(void)setBorderWidth:(CGFloat)width { self.layer.borderWidth = width; } -(void)setCornerRadius:(CGFloat)radius { self.layer.cornerRadius = radius; self.layer.masksToBounds = radius > 0; } @end
在UIView扩展中添加以下@IBInspectables
extension UIView { @IBInspectable var borderWidth: CGFloat { get { return layer.borderWidth } set(newValue) { layer.borderWidth = newValue } } @IBInspectable var borderColor: UIColor? { get { if let color = layer.borderColor { return UIColor(CGColor: color) } return nil } set(newValue) { layer.borderColor = newValue?.CGColor } } }
然后你应该能够从属性检查器中直接设置borderColor和borderWidth属性。见附图
属性检查器
@IBInspectable在iOS 9和Swift 2.0上为我工作
extension UIView { @IBInspectable var borderWidth: CGFloat { get { return layer.borderWidth } set(newValue) { layer.borderWidth = newValue } } @IBInspectable var cornerRadius: CGFloat { get { return layer.cornerRadius } set(newValue) { layer.cornerRadius = newValue } } @IBInspectable var borderColor: UIColor? { get { if let color = layer.borderColor { return UIColor(CGColor: color) } return nil } set(newValue) { layer.borderColor = newValue?.CGColor } }
试试下面的代码:
view.layer.borderColor = [UIColor redColor].CGColor; view.layer.borderWidth= 2.0; [view setClipsToBounds:YES];
view.layer.borderWidth = 1.0 view.layer.borderColor = UIColor.lightGray.cgColor
swift 4.2中项目的边框颜色:
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell_lastOrderId") as! Cell_lastOrder cell.layer.borderWidth = 1 cell.layer.borderColor = UIColor.white.cgColor cell.layer.cornerRadius = 10
(self。view。layer setBorderColor: [uicolcolorwithred:0.265 green:0.447 blue:0.767 alpha:1.0f].CGColor];