自定义UI 的作用是为了提高效率,满足需求!尤其是复杂的UI,xib 效率会更好一些。
2种常用方式 xib 和 纯代码
*** xib 和 存代码 也可以这么理解:如果不用xib文件的话用initWithFrame做初始化,用xib的话用awakeFromNib初始化 ***
纯代码
(代码就不贴了,想要demo的话,我可以放到Github, 有什么事可以isuse 我哈!)
1、自定义一个 HZCustomShareView : UIView
a、通常情况下,自定义View 的话都使用 代理设计模式。(其实就是套路)
b、在.m 文件里 重写init 方法---》 写布局 -----》重写方法计算子控件大小 (其实又是套路)。
重写计算子控件:
经过简单的步骤后,直接在其它 控制器里 懒加载,调用就可以了。(好吧,又是套路),下面的图哪个注释的代码也是可以的哈。
xib 自定义
》当建立控制器并勾选XIB的时候,是控制器的时候,不会走- (void)awakeFromNib方法,需要在- (void)viewDidLoad里面书写相应的操作。只有当建立UIView的时候并勾选XIB的时候才会走- (void)awakeFromNib方法。切记!
-(void)awakeFromNib;从字面上理解,就是从nib文件中唤醒对象,完成对每一个对象的实例化或与nib文件的关联。
.
谁唤醒这个方法?
答:awakeFromNib是由nib loading machinery发出的。[NSBundle loadNibFile:externalNameTable:withZone:],加载nib文件,完成初始化设置和连接,并且在所有关联的对象上唤醒awakeFromNib方法。
感谢!!!
.
谁响应这个方法?
Cunstom Controller 和Cunstom Window都会响应awakeFromNib方法。当一个nib文件已经完成所有对象的加载之后,会对每一个与nib文件关联的对象loop back。此时,如果awakeFromNib方法中有需要响应的对象,它就会在该对象上唤起awakeFromNib方法。因此,我们可以在awakeFromNib方法中操作任何甚至所有的nib中的对象。
需要注意的问题:
当使用一个controller控制多个nib文件时,awakeFromNib方法会被多次调用。因此,当不使用awakeFromNib方法来完成nib对象的初始化时,需要注意此方法的多次调用对其他nib文件造成的影响
常用的是 表视图的 cell。那个简单,这里不介绍了,下面介绍的是普通的View
1、自定义一个UIView 类
2、在init方法里填上如下:
👇是代码:加载xib
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
CGRect frame = self.frame;
frame.size.width = self.frame.size.width;
[self setFrame:frame];
UIView *view = nil;
view.backgroundColor = [UIColor redColor];
NSArray* nibView = [[NSBundle mainBundle] loadNibNamed:@"ParentsView" owner:self options:nil];
for (id obj in nibView) {
if ([obj isKindOfClass:[UIView class]]) {
view = obj;
break;
}
}
if (view != nil) {
view.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:view];
}
}
return self;
}
然后在控制器了,懒加载,调用就可以了。
运行效果:(嗯,还需适配调整)