是否可以直接从界面生成器控制UIView边框属性(颜色,厚度等),还是只能以编程方式进行控制?
是否可以直接从界面生成器控制UIView边框属性(颜色,厚度等),还是只能以编程方式进行控制?
Answers:
实际上,您可以通过界面生成器设置视图图层的某些属性。我知道我可以通过xcode设置图层的borderWidth和cornerRadius。borderColor不起作用,可能是因为该图层需要CGColor而不是UIColor。
您可能必须使用字符串而不是数字,但是可以!
layer.cornerRadius
layer.borderWidth
layer.borderColor
更新:layer.masksToBounds = true
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
至少为1才能看到具有所选颜色的边框。
在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!)
}
}
}
与iHulk的答案类似,但在Swift中
在您的项目中添加一个名为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
}
}
}
然后,它将在“界面构建器”中为“实用工具面板”>“属性检查器”中的每个按钮,imageView,标签等可用:
注意:边框只会在运行时出现。
@IBDesignable
从该扩展的开头删除之前,我一直在使用这种方法使Interface Builder崩溃。
您可以创建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等)
就是这样。无需在任何地方导入类别,只需在项目中添加类别的文件,然后在情节提要中查看这些属性。
对于Swift 3和Swift 4,如果您愿意使用IBInspectable
s,则可以使用以下命令:
@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
}
}
}
虽然这可能会设置属性,但实际上并不会反映在IB中。因此,如果您基本上是用IB编写代码,则最好在源代码中进行操作
如果您想节省时间,只需UIViews
在顶部使用两个,在后面的一个是边框颜色,在前面的一个较小,以产生边框效果。我也不认为这是一个优雅的解决方案,但是如果Apple多关心一点,那么您就不必这样做。
即使在这里尝试了所有解决方案后,Storyboard也不总是对我有用
因此,使用代码始终是一个完美的答案,只需创建UIView的IBOutlet实例并添加属性
简短答案:
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
长答案:
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
请添加以下2条简单的代码行:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
它将正常工作。