ios开发中,User Defined Runtime Attributes的应用

User Defined Runtime Attributes 是一个不被看重但功能非常强大的的特性,它能够配置一些你在interface builder 中不能配置的属性。当你希望在IB中作尽可能多得事情,这个特性能够帮助你编写更加轻量级的viewcontroller。

1、在什么情况下使用

当你使用IB(Storyboard或者Xib)编辑视图的时候,有时可能会遇到诸如 圆角、边框、边框颜色、等等难以通过IB直接设置的属性。

这时你不得不借助代码实现。其实当出现这类情况时,我们其实可以借助Runtime Attribute在IB中实现。

2、如何使用

如图所示,在IB中,点击任意一个控件切换到identity inspector

在User Defined Runtime Attributes新增属性

在这里可以为控件设置值为

Boolean - BOOL

Number - NSNumber 对象 或者 枚举 或者 NSInteger 或者CGFloat

String - NSString *

Point - CGPoint

Size - CGSize

Range - NSRange

Color - UIColor *

等属性,但必须逐级调用

例如 layer.cornerRadius layer.masksToBounds 这里其实是 对象.layer.cornerRadius 的调用关系

同时,你甚至可以为它设置一个自定义的属性

比如你可以随意扩充一个名位 status 的属性表示开启状态,但前提是你必须为控件自定义一个实现了 runtime自动构建成员的引用。

如图1所示,这里有一个 layer.borderColorFromeUIColor,这实际上是我为了解决IB不能设置CGColor和为CALayer引入的一个属性。

如图2所示,我们在Swift中为CALayer 扩展一个属性

使用的时候写成 layer.borderColorFromUIColo(标准的Set方法调用),这样IB也可以设置CGColor了

编译运行,及实现了在IB中为控件设置 圆角,边框,边框颜色

1.如何使用

当你使用interface builder是点击任意一个控件,转换到identity Inspector

图 1

2属性类型

下面是一些可用的Attribute Types与其相对应的数据类型

Boolean– BOOL

Number–NSNumber * or any numeric scalar, e.g. NSInteger

String– NSString *

Point  – CGPoint

Size  – CGSize

Rect– CGRect

Range–NSRange

Color– UIColor *

这里还有下面一些特殊的类型:

Nil- 就是设置这个属性为nil

Localized String - 一个在locale文件当中的键值,它会在你的 strings 文件中去匹配对应的本地化字符

demo

配置一个 view 下面的CALayer 的属性,一般我们都是在viewController里的viewDidLoad里写代码进行配置,现在如果你要设置

layer.borderWidth 和 layer.cornerRadius 你只需要如下所示:

编译运行如下:

如果说你要配置一个自定义的控件,你就可以在User Defined Runtime Attributes里配置你的自定义的属性了 如 你的自定义的Button 自定义了一个叫name的属性那可以

如果你要在代码中获取你的自定义属性,你就可以

id value = [sender valueForKey:@"name"];

Converting From Other Types

只要相应的attribute type代表的时同样的数据类型,那么他们就可以相互替换使用。例如:Point和Size他们地下其实都是同样的结构体{float a,float b}。

但是除了上述几种attribute type,你还可以使用其他的IB不支持数据类型吗?例如我要配置CALayer的 border coloer 和 shadow color,他们都是CGColorRef类型的,并不能直接在User Defined Runtime Attributes进行配置,但请看解决方案:

图5

为了兼容CALayer 的KVC ,你得给CALayer增加一个分类

@implementation CALayer (Additions)

- (void)setBorderColorFromUIColor:(UIColor *)color

{

self.borderColor = color.CGColor;

}

@end

Convert From String

这经常从NSString中转换成你所要的类型,例如 配置一个 UIEdgeInsets类型的属性,这个不能够被运行时属性支持,但可以考虑如下方案

@implementation UIScrollView (Additions)

- (void)setContentInsetFromString:(NSString *)contentInsetString

{

self.contentInset = UIEdgeInsetsFromString(contentInsetString);

}

@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,613评论 6 30
  • 今天感冒好了。所以打算开始进行一点不一样的生活,昨天虽然感冒,但是因为独处了。所以心瘾还是特别的重,今天就好很多了...
    对月饮酒阅读 140评论 0 0
  • 今早一打开手机,就看到了件大快人心的新闻,“乐天史上最强促销,销售额不升反降”,国民同胞们,这次真是要好好表扬你们...
    小诺z阅读 307评论 3 5
  • 公元528年,孝昌三年,尔朱荣率高欢侯景慕容绍宗贺拔胜兄弟一干枭雄,大破河北起义军葛荣百万(实三十万)大军于...
    家荣云川阅读 758评论 0 2