iOS链式创建UI终结者 ➜ PPMaker
在iOS开发中,创建UI控件是必不可少的,尤其是当你刚开始一个新项目的时候。
我自己的编程逻辑向来追求简单:怎么能不挨个属性去写?带着这个问题,我开始创建了各种工具来处理,后来使用Category(证据在此),但是Category有个烦恼的问题:有些属性我不想写,但方法参数中却有,而有些属性我想写,但方法参数中没有。
昨天,看到臧成威的如何利用Objective-C写一个精美的DSL,唉,挺好的,就想优化一下自己写的,于是就有了 PPMaker。
在此,向臧老师表示感谢。
PPMaker 的不同(优点)
➊ 链式调用,代码简洁;
➋ 点语法后面有提示(Masonry是没有的)
;
➌ 不需要终结词 臧老师给的示例有
; ➍ 不需要助词 如Masonry中的with
,这也算是一个缺点吧; ➎ pod可根据需求随意选择。
PPMaker 的用法
第一步、导入 PPMaker
方法一、使用CocoaPods安装
pod 'PPMaker', '~> 0.0.22'
方法二、手动下载拖入
如:UILable
直接调用pp_
第二步、用对应的类
maker调用,直接调UILabel对象的属性,如
text
、textColor
、frame
等,当然也有自定义的,如intoView
表示要加到哪个view上、fontSize
实际上[UIFont systemFontOfSize:fontSize]
的简化等等。总之,PPMaker非常容易使用。
创建UI控件的过程
最初:一个属性一个属性赋值
UILabel *lb = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 50)];
[self.view addSubview:lb];
lb.backgroundColor = [UIColor whiteColor];
lb.text = @"我是一个lb";
lb.textColor = [UIColor blueColor];
lb.textAlignment = NSTextAlignmentCenter;
lb.font = [UIFont systemFontOfSize:18];
后来:使用类别快速创建
@interface UILabel (EasyMake)
+(UILabel *)lbMakeWithSuperV:(UIView *)superV
frame:(CGRect)frame
font:(UIFont *)font
alignment:(NSTextAlignment)alignment
text:(NSString *)text
textColor:(UIColor *)textColor;
@implementation UILabel (EasyMake)
+(UILabel *)lbMakeWithSuperV:(UIView *)superV
frame:(CGRect)frame
font:(UIFont *)font
alignment:(NSTextAlignment)alignment
text:(NSString *)text
textColor:(UIColor *)textColor
{
UILabel *lb = [[UILabel alloc]init];
if (superV) {
[superV addSubview:lb];
}
if (font) {
lb.font = font;
}
if (text) {
lb.text = text;
}
if (textColor) {
lb.textColor = textColor;
}
lb.frame = frame;
lb.textAlignment = alignment;
return lb;
}
@end
当前:链式调用的 DSL
结语
PPMaker是我最满意的库之一,解决了创建UI、配置attributedText的困扰,在这个过程中也参考了一些大神的博客和开源库,在此,再次表示感谢。今天,分享这个库,希望能帮助和我一样的小伙伴,其次,如果觉得不错,请给予star。
当然,这个库会持续更新,有任何问题都欢迎提出。或者如果有更好的方法,也非常欢迎告诉我,非常感谢!
版本更新记录
2018-06-11
- 真正解决了
XCode
警告,同时优化提升信息更清晰,如:当用UILabel *
调用UIButton *
的titleState
后运行,控制台会提示“Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: ''💊 请注意💊 :titleState
不是UILabel所拥有的属性,而是UIButton特有的!更多请看 -[PPMake(UIButton) titleState] 第33行'”; UIButton
新增了setImageEdgeInsets
和setTitleEdgeInsets
;
2018-06-09
- 优化
UIImageView
设置image
和UIButton
设置image
导致PPMake
在调用UIButton
时调用了UIImageView
的image
; **具体做法**:UIButton
中的image
->imageState
。 - 优化
UIButton
中快速设置attributedStr
,不再依赖对应状态的title
必须有值; **具体做法**:attributedFontColor
->attributedFontColorTitle
,normalAttributedFontColor
->normalAttributedFontColorTitle
,highlightAttributedFontColor
->highlightAttributedFontColorTitle
PPMake
对应的Category
分离出去,虽然类文件增多,但是不会使PPMake
显得过于复杂或庞大;- 处理
圆角+阴影
的情况,如果阴影+阴影透明度
都为0,则只设置圆角。 - 新增
UIButton
防止重复点击功能;