为类目(类别)添加属性,使用storyboard设置边框颜色

通常使用Category时,只能添加方法,不可添加属性。但是在使用Storyboard时我们可能会使用到keyPath,这里设置的key都需要是所设置视图的属性值,并且类型有所限制。

例如:我现在有一个按钮,我想设置成圆角,并且是紫色边框。并且我不想写代码,想通过storyboard直接设置。这样看起来很帅(其实就是一个强迫症吧,因为一直在用sb设置整个界面,但是突然出现几个样式,在sb中不可以直接设置,这种感觉很烦躁的,所以要解决掉它)。

遇到的问题:这里key path 的type类型是固定的,这里我们不可以添加。这里只有一个UIColor类型的color,但是设置边框的颜色,应该是CGColor的,所以类型不匹配,我们需要为CALayer添加一个UIColor的属性。这里我们使用Category,不用疑问,对,是使用Category为CALayer添加一个UIColor的属性。

CALayer+Addition.h

#import
<QuartzCore/QuartzCore.h>

#import
<UIKit/UIKit.h>

@interface CALayer (Additions)

@property(nonatomic,
strong) UIColor *borderColorFromUIColor;

- (void)setBorderColorFromUIColor:(UIColor *)color;

@end

CALayer+Addition.m

#import
"CALayer+Additions.h"

#import
<objc/runtime.h>

@implementation CALayer (Additions)

//static const void *borderColorFromUIColorKey = &borderColorFromUIColorKey;

//@dynamic borderColorFromUIColor;

- (UIColor *)borderColorFromUIColor {

return objc_getAssociatedObject(self,
@selector(borderColorFromUIColor));

}

-(void)setBorderColorFromUIColor:(UIColor *)color

{

objc_setAssociatedObject(self,
@selector(borderColorFromUIColor), color,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);

[self
setBorderColorFromUI:self.borderColorFromUIColor];

}

- (void)setBorderColorFromUI:(UIColor *)color

{

self.borderColor = color.CGColor;

//    NSLog(@"%@", color);

}

这样就成功为CALayer添加了borderColorFromUIColor属性,并且在key path里可能成功设置该属性,为按钮设置边框颜色了。

实现效果

时间: 2024-08-11 03:25:19

为类目(类别)添加属性,使用storyboard设置边框颜色的相关文章

在类目中添加属性

.h文件 //分类的头文件 @interface ClassName (CategoryName) @property (nonatomic, strong) NSString *str;//此为新增的属性 //此为新增的属性 @end .m文件 //实现文件 #import "ClassName + CategoryName.h" #import <objc/runtime.h> static void *strKey = &strKey; @implementa

OC中协议, 类目, 时间, 延展, 属性

必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @property (nonatomic, assign) id<marryprotocol> husband; 避免Optitonal没有实现的功能 if ([_husband respondsToSelector:@selector(driver)]) { [_husband driver]; } @required//必须实现的协议, 默认协议 - (void)s

给类别添加属性(通过@dynamic和objc_setAssociatedObject实现)

通过@dynamic和objc_setAssociatedObject,实现给类别添加属性,前者说明:程序员手动实现setter和getter,后者则是动态给对象添加属性.两个配合使用可以实现给对象添加属性. 下面代码以scrollview为例,给scrollView添加一个refreshView属性,别的地方可以像正常属性一样使用refreshView: [头文件] @interface UIScrollView (Refresh) @property (nonatomic) RefreshV

runtime在实际开发中的应用-为类别添加属性

利用运行时set和get这两个API,可以让类别添加属性 1.创建一个类别:NSObject+Category 2..h生命get和set方法 @property(nonatomic,copy)NSString *name; 3..m重写set和get方法,内部利用runtime给属性赋值和取值 char nameKey; - (void)setName:(NSString *)name { // 将某个值跟某个对象关联起来,将某个值存储到某个对象中 objc_setAssociatedObje

为一个类动态的添加属性

/* 1不想集成一个类添加属性,想动态的添加一个属性 */ ||解决步骤 1.新建一个分类,导入 #import <objc/runtime.h> 2.添加属性(添加的属性,只是做了声明,并没有帮我们生成set,get方法) 3.手动添加set,get方法 {1.在set方法中实现 /* *@object 为那个对象添加属性 *@key  添加一个对应的key  c语言类型的 *@value  对应的值 *@objc_AssociationPolicy  策略 */ objc_setAssoc

python类对象动态添加属性和方法

class Person(): #创建一个类 def __init__(self,name): #定义初始化信息. self.name = name li = Person('李') #实例化Person('李'),给变量li li.age = 20 #再程序没有停止下,将实例属性age传入.动态语言的特点. Person.age = None #这里使用类名来创建一个属性age给类,默认值是None.Python支持的动态属性添加. def eat(self): #定义一个方法,不过这个方法再

ECshop网点程序优化-后台添加类目自动选择上次父类目并计算Sort Order

如果在ECshop后台批量添加过大量类目的人都能体会到是多么的不方便(这点还是要说一下ECshop的产品经理,细节上还是要多注意),每次添加都需要在几百个类目里面找到要添加的父类目也是一个麻烦事,比如我的 Tao Fashion 站,里面一共有400多个类目 每次添加一个新类目,即使是同一父类目下的,都需要从头再找一遍,非常不方便,设置类目的顺序的时候,也要自己记着这个父类目下已经添加几个了,记着下一个添加的时候+1,经常弄错. 咱是新人类,要用技术的办法解决这个问题,实现在Category L

iOS类目、延展和协议

类目:为已知的类增加新的方法:注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用 1.类目无法向已有类中添加实例变量.2.如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,如果方法名冲突,已有类中的原始方法便无法使用.3.在使用类目的时候,最好是将自己扩展的方法和原始方法区分开来. 1.类目方法的应用: 1)对现有类进行扩展:如:可以扩展Cocoatouch框架中的类,在类目中增加的方法会被子类继承,而且在运行时跟其他的方法没有区别. 2)作为子类的替代手段:

OC 类目、协议

类目:为现有的类添加新方法 1.需要添加该类的新方法,但是不能继承该类的情况下 类目使用需要注意的问题: 1.类目里面不能添加实例变量,但是类目可以声明属性,但必须实现set get 方法,在这两个实现方法里面依然不能使用自己添加的实例方法 2.类目里添加的方法不能和原类中的方法重名,否则会导致覆盖 3.一个类可以添加多个类目,但是类目名和方法名不能重复 4.类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继承 类目的创建与使用: File:是类目的名称 File Type: