利用IBInspectable减少代码设置

字数 358阅读 213
  • 通过IB设置View属性的时候有一些局限性,往往有一些属性没有暴露在IB的设置面板中,这时候我们需要通过设置@IBOutlet,或者在IB上使用User Defined Runtime Attributes通过KVC的方式配置一些你在IB 中不能配置的属性,这样增加了大量的开发时间。
  • 在工程实践中,在对应的view中添加IBInspectable的方式来解决对IB或者SB的使用,带来实质性的改善
1.通过自定义对应view的方式,动态在IB上显示修改的内容
cuntomLabel.gif
  • OC:
.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
  • Swift:

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方法来解决
  • OC:
.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

  • Swift:
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内的值
IBInspectable.png

推荐阅读更多精彩内容