• 问题总会出现,不过解决问题的方法也会出现!!!

在OC和Swift中Storyboad动态刷新属性

实测结果 小雨 来源:Wenchen的专栏 873次浏览 已收录 0个评论

Xcode中 属性能够在storyboard中动态刷新,这种方式能够大大提高自定义开发效率。


在OC和Swift项目中使用方法基本一致,只是关键字的形式不同
IB_DESIGNABLE和@IBDesignable 可以使KVC的属性栏User Defined Rumtime Attributes直接动态渲染
key值可以直接使用系统定义的 也可以是自己定义的

IBInspectable和@IBInspectable可以使个人自定义的属性值动态出现在show the attributes inspector这一栏
同时会自动在User Defined Rumtime Attributes的里面生成kvc属性

不过要想使 IBInspectable和@IBInspectable 生效 必须先 使用 IB_DESIGNABLE和@IBDesignable 才能实现动态渲染效果


在Object-C中使用下面这两个预定义宏实现storyboard动态刷新属性

IBInspectable和IB_DESIGNABLE

使用方法

IB_DESIGNABLE的宏的功能就是让XCode动态渲染出该类图形化界面。
使用方式,把该宏加在自定义类的前面

IB_DESIGNABLE
@interface IBDesigbableImageview : UIImageView
@end

然后,再设置imageview为继承类,并且设置圆角

在OC和Swift中Storyboad动态刷新属性

可以看到,storyboard上的imageview动态刷新了

在OC和Swift中Storyboad动态刷新属性

IBInspectable

让支持KVC的属性能够在Attribute Inspector中配置。
添加属性以及Set方法即可,如果是现有类,使用Category
例如为imageView的继承类设置cornerRadius
头文件添加属性

@interface IBDesigbableImageview : UIImageView
@property (nonatomic) IBInspectable CGFloat cornerRadius;
@end

@implementation IBDesigbableImageview
-(void)setCornerRadius:(CGFloat)cornerRadius{
_cornerRadius = cornerRadius;
self.layer.cornerRadius = cornerRadius;
self.layer.masksToBounds = cornerRadius > 0?true:false;
}
@end

这样,在Attribute Inspector就会多出一个配置选项
在OC和Swift中Storyboad动态刷新属性
通过设置这个选项,就可以设置layer的圆角了。
每次设置圆角,都会在Identity Inspector中改变一个rumtime的KVC变量
在OC和Swift中Storyboad动态刷新属性
不过,现在仍然不能动态刷新
通过IB_DESIGNABLE配合IBInspectable可以实现动态刷新

实现方式很简单,就是在自定义类的头文件处加上这个宏定义即可。然后把对应的类设置为自定义的类。

.h文件
IB_DESIGNABLE
@interface IBDesigbableImageview : UIImageView
@property (nonatomic) IBInspectable CGFloat cornerRadius;
@end

.m文件
#import IBDesigbableImageview.h
 
@implementation IBDesigbableImageview
 
-(void)setCornerRadius:(CGFloat)cornerRadius{
    _cornerRadius = cornerRadius;
    self.layer.cornerRadius = cornerRadius;
    self.layer.masksToBounds = cornerRadius > 0?true:false;
}

效果就是最开始的Demo
如果不能动态刷新,重启XCode,如果还不能刷新,如下图RefreshingAllViews,建议开启Automatically Refresh Views
在OC和Swift中Storyboad动态刷新属性

Swift中使用下面这两个预定义宏实现storyboard动态刷新属性

@IBDesignable/@IBInspectable

其余和在OC中都一样

import UIKit

@IBDesignable
class VVView: UIView {
    
    @IBInspectable var bColor : UIColor?{
        didSet{
            backgroundColor = bColor
        }
    }
    
    @IBInspectable var cornerRadius : CGFloat = 0.0{
        didSet{
            layer.cornerRadius = cornerRadius
        }
    }
}

本博客内容既有转载自网络的内容,也有本作者原创内容,仅供学习与交流之用
如有侵权或者错误之处,请及时在下方留言!
喜欢 (1)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址