雖然iOS 自帶的button帶有 imageEdgeInsets和titleEdgeInsets但是個人感覺用起來有時候達不到 想要的效果,很是不爽.... 所以練習鏈式寫法的時候 ,隨手寫了一個button和大家分享一下!
1.button的title.
2.button的image.
3.button的高亮效果.
4.button的點擊事件.
//----------Button的創(chuàng)建和調用---------//
{
JMButton* sender1 = [JMButton creatButton:CGRectMake(100, 100, 100, 100)];
sender1.ImageEdgInsets(20,0,60,60)
.TitleEdgInsets(0,63,100,23)
.ImagePrams(@"hehe.jpg",1)
.TitlePrams(@"呵呵達~",17,[UIColor redColor])
.ClickAction(^(JMButton* sender){
NSLog(@"Action---");
});
[self.view addSubview:sender1];
}
{
JMButton* sender2 = [JMButton creatButton:CGRectMake(100, 200, 100, 100)];
sender2.ImageEdgInsets(0,25,40,40).TitleEdgInsets(45,32,55,25).ImagePrams(@"empty_loding.png",1).TitlePrams(@"不開心!",16,[UIColor redColor]).ClickAction(^(JMButton* sender){
NSLog(@"Action---");
});
sender2.jmImagev.layer.cornerRadius = 10;
sender2.jmImagev.layer.masksToBounds = YES;
[self.view addSubview:sender2];
}
{
JMButton* sender3 = [JMButton creatButton:CGRectMake(120, 300, 80, 30)];
sender3.ImageEdgInsets(0,2.5,25,25)
.TitleEdgInsets(27,2.5,55,25)
.ImagePrams(@"111.jpg",1)
.TitlePrams(@"發(fā)微博",16,[UIColor blueColor])
.ClickAction(^(JMButton* sender){
NSLog(@"Action---");
});
[self.view addSubview:sender3];
}
//.h公開的方法屬性
/** Imagev的frame嘹裂,參數為“(x, y, w, h)” */
@property(nonatomic,copy)
JMButton* (^ImageEdgInsets)(float left,float top,float width,float height);
/** Title的frame戈盈,參數為“(x, y, w, h)” */
@property(nonatomic,copy)
JMButton* (^TitleEdgInsets)(float left,float top,float width,float height);
/** Imagev的參數值赏迟,“(NSString* imgName,UIViewContentMode mode)” */
@property(nonatomic,copy)
JMButton* (^ImagePrams)(NSString* imgName,UIViewContentMode mode);
/** Title的參數值,“(title, fountSize, textColor)” */
@property(nonatomic,copy)
JMButton* (^TitlePrams)(NSString* title,NSInteger fountSize,UIColor*textColor);
/** 點擊事件缸逃,“(id target, SEL clickAction)” */
@property(nonatomic,copy)JMButton* (^ClickAction)(void(^)(JMButton* sender));
效果截圖.png
實現起來很簡單,無非就是在view中創(chuàng)建 一個label 一個imageview
主要分享一下block實現鏈式的寫法......
1.聲明
//一個block屬性返回值類型是 '自己'.
/** Imagev的參數值,“(NSString* imgName,UIViewContentMode mode)” */
@property(nonatomic,copy)
JMButton* (^ImagePrams)(NSString* imgName,UIViewContentMode mode);
(有兩個參數,一個是name ,另一個就是imageView填充方式)
2.調用
這里block屬性的調用.. 調用完之后 由于返回返回值是 自身 (self), 所以可以再調用其他block屬性 實現一系列的調用
sender.ImagePrams(@"hehe.jpg",1);
3.隨意鏈接
sender1.ImageEdgInsets(20,0,60,60)
.TitleEdgInsets(0,63,100,23)
.ImagePrams(@"hehe.jpg",1)
.TitlePrams(@"呵呵達~",17,[UIColor redColor]);
4, 點擊事件---- block的嵌套
// 將點擊block當另一block的參數傳遞出去 詳情看下面.m的實現
/** 點擊事件粗恢,“(id target, SEL clickAction)” */
@property(nonatomic,copy)JMButton* (^ClickAction)(void(^)(JMButton* sender));
最后貼上.m的主要代碼...很簡單 就是復寫get方法 獲取參數 賦值而已...
//block的getter
-(JMButton *(^)(NSString *, UIViewContentMode))ImagePrams{
return ^JMButton* (NSString* imgName,UIViewContentMode mode){
self.jmImagev.image = [UIImage imageNamed:imgName];
self.jmImagev.contentMode = mode;
return self;
};
}
//block的嵌套getter
-(JMButton *(^)(void(^block)(JMButton*)))ClickAction{
return ^JMButton* (void(^block)(JMButton* sender)){
if (!objc_getAssociatedObject(self, &clickActionKey)) {
UIGestureRecognizer* gesture = objc_getAssociatedObject(self, &clickActionKey);
if (!gesture) {
gesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clickAction:)];
objc_setAssociatedObject(self, &clickActionKey, gesture, OBJC_ASSOCIATION_RETAIN);
[self addGestureRecognizer:gesture];
}
objc_setAssociatedObject(self, &blockActionKey, block, OBJC_ASSOCIATION_COPY);
}
return self;
};
}
主要還是鏈式 這種寫法吧 希望以后有機會能排上用場..