是否有可能从界面生成器设置UIView边框属性?
是否有可能直接从界面生成器控制UIView边框属性(颜色,厚度等),或者我只能以编程方式?
其实你可以通过界面构build器来设置视图层的一些属性。 我知道我可以通过xcode设置图层的borderWidth和cornerRadius。 borderColor不起作用,可能是因为图层想要一个CGColor而不是UIColor。
你可能不得不使用string而不是数字,但它的工作原理!
layer.cornerRadius layer.borderWidth layer.borderColor
更新:select适当的Keypathtypes:
Rich86Man的答案是正确的,但你可以使用类别来代理属性,如layer.borderColor。 (来自ConventionalC CocoaPod)
CALayer的+ XibConfiguration.h:
#import <QuartzCore/QuartzCore.h> #import <UIKit/UIKit.h> @interface CALayer(XibConfiguration) // This assigns a CGColor to borderColor. @property(nonatomic, assign) UIColor* borderUIColor; @end
CALayer的+ XibConfiguration.m:
#import "CALayer+XibConfiguration.h" @implementation CALayer(XibConfiguration) -(void)setBorderUIColor:(UIColor*)color { self.borderColor = color.CGColor; } -(UIColor*)borderUIColor { return [UIColor colorWithCGColor:self.borderColor]; } @end
layer.borderUIColor
结果将在运行时显而易见,而不是在Xcode中。
编辑 :您还需要将layer.borderWidth
设置为至less1以查看具有所选颜色的边框。
在Swift 2.0中:
extension CALayer { var borderUIColor: UIColor { set { self.borderColor = newValue.CGColor } get { return UIColor(CGColor: self.borderColor!) } } }
在Swift 3.0中:
extension CALayer { var borderUIColor: UIColor { set { self.borderColor = newValue.cgColor } get { return UIColor(cgColor: self.borderColor!) } } }
你可以做一个UIView的类别,并将其添加到类别的.h文件中
@property (nonatomic) IBInspectable UIColor *borderColor; @property (nonatomic) IBInspectable CGFloat borderWidth; @property (nonatomic) IBInspectable CGFloat cornerRadius;
现在将其添加到.m文件中
@dynamic borderColor,borderWidth,cornerRadius;
这也在。 m文件
-(void)setBorderColor:(UIColor *)borderColor{ [self.layer setBorderColor:borderColor.CGColor]; } -(void)setBorderWidth:(CGFloat)borderWidth{ [self.layer setBorderWidth:borderWidth]; } -(void)setCornerRadius:(CGFloat)cornerRadius{ [self.layer setCornerRadius:cornerRadius]; }
现在你会看到在你的故事板中的所有UIView子类(UILabel,UITextField,UIImageView等)
多数民众赞成它..不需要任何地方导入类别,只需添加该类别的文件在项目中,并在故事板中看到这些属性。
类似的答案iHulk的一个,但在斯威夫特
在您的项目中添加一个名为UIView.swift的文件(或者将其粘贴到任何文件中):
import UIKit @IBDesignable extension UIView { @IBInspectable var borderColor: UIColor? { set { layer.borderColor = newValue?.cgColor } get { guard let color = layer.borderColor else { return nil } return UIColor(cgColor: color) } } @IBInspectable var borderWidth: CGFloat { set { layer.borderWidth = newValue } get { return layer.borderWidth } } @IBInspectable var cornerRadius: CGFloat { set { layer.cornerRadius = newValue clipsToBounds = newValue > 0 } get { return layer.cornerRadius } } }
然后,在“工具”面板>“属性检查器”中的每个button,图像视图,标签等界面生成器中,
注意:边框只会在运行时出现。
虽然这可能会设置属性,但它实际上并不反映在IB中。 所以,如果你基本上用IB编写代码,那么你可以在源代码中完成
如果你想节省时间,只需使用两个UIViews
在彼此的顶部,一个在后面的是边界颜色,而在前面的一个较小,给出了边界的效果。 我不认为这是一个优雅的解决scheme,但如果苹果关心一点,那么你不应该这样做。
对于Swift 3和Swift 4来说 ,如果你愿意使用IBInspectable
,那就是:
@IBDesignable extension UIView { @IBInspectable var borderColor:UIColor? { set { layer.borderColor = newValue!.cgColor } get { if let color = layer.borderColor { return UIColor(cgColor: color) } else { return nil } } } @IBInspectable var borderWidth:CGFloat { set { layer.borderWidth = newValue } get { return layer.borderWidth } } @IBInspectable var cornerRadius:CGFloat { set { layer.cornerRadius = newValue clipsToBounds = newValue > 0 } get { return layer.cornerRadius } } }