- 通过IB设置View属性的时候有一些局限性,往往有一些属性没有暴露在IB的设置面板中,这时候我们需要通过设置
@IBOutlet
,或者在IB上使用User Defined Runtime Attributes
通过KVC的方式配置一些你在IB 中不能配置的属性,这样增加了大量的开发时间。
- 在工程实践中,在对应的view中添加
IBInspectable
的方式来解决对IB或者SB的使用,带来实质性的改善
1.通过自定义对应view的方式,动态在IB上显示修改的内容
.h
// 在`@interface`前,加上`IB_DESIGNABLE`实现IB上的动态布局
IB_DESIGNABLE
@interface customLabel : UILabel
// 在声明属性类型前,加上`IBInspectable`,在IB上显示成员属性
@property (nonatomic,assign) IBInspectable CGFloat cornerRadius;
@property (nonatomic,assign) IBInspectable CGFloat borderWidth;
@property (nonatomic,strong) IBInspectable UIColor *borderColor;
@end
.m
/**
重写set、get方法实现需要的内容
*/
@implementation customLabel
- (void)setCornerRadius:(CGFloat)cornerRadius {
self.layer.cornerRadius = cornerRadius;
self.clipsToBounds = cornerRadius > 0;
}
- (CGFloat)cornerRadius {
return self.layer.cornerRadius;
}
- (void)setBorderWidth:(CGFloat)borderWidth {
self.layer.borderWidth = borderWidth;
}
- (CGFloat)borderWidth {
return self.layer.borderWidth;
}
- (void)setBorderColor:(UIColor *)borderColor {
self.layer.borderColor = borderColor.CGColor;
}
- (UIColor *)borderColor {
return [UIColor colorWithCGColor:self.layer.borderColor];
}
@end
import UIKit
@IBDesignable
class cuntomLabel: UILabel {
@IBInspectable var cornerRadius : CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
clipsToBounds = newValue > 0
}
}
}
- 优点:可以在IB或者SB上可以直观的显示修改的属性
- 缺点:IB上的view必须使用对应的自定义的view才可以修改,耦合性太强
2.在对应的view中添加IBInspectable的extension方法来解决
.h
// `IB_DESIGNABLE` 仅对自定义view有效,分类上使用无效
@interface UILabel (Extension)
@property (nonatomic,assign) IBInspectable CGFloat cornerRadius;
@property (nonatomic,assign) IBInspectable CGFloat borderWidth;
@property (nonatomic,strong) IBInspectable UIColor *borderColor;
@end
.m
@implementation UILabel (Extension)
- (void)setCornerRadius:(CGFloat)cornerRadius {
self.layer.cornerRadius = cornerRadius;
self.clipsToBounds = cornerRadius > 0;
}
- (CGFloat)cornerRadius {
return self.layer.cornerRadius;
}
- (void)setBorderWidth:(CGFloat)borderWidth {
self.layer.borderWidth = borderWidth;
}
- (CGFloat)borderWidth {
return self.layer.borderWidth;
}
- (void)setBorderColor:(UIColor *)borderColor {
self.layer.borderColor = borderColor.CGColor;
}
- (UIColor *)borderColor {
return [UIColor colorWithCGColor:self.layer.borderColor];
}
@end
import UIKit
extension UILabel {
@IBInspectable var cornerRadius : CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
clipsToBounds = newValue > 0
}
}
}
- 优点:不需要自定义view,可直接在IB上对显示定义的属性进行修改,无耦合性
- 缺点:和使用
User Defined Runtime Attributes
一样,不能直观的显示修改的属性,需要运行程序才能显示效果
3.使用IBInspectable
系统会自动在User Defined Runtime Attributes
添加使用的属性,若果不想使用在IB上自定义的属性,一定要清空User Defined Runtime Attributes
内的值