常用
创建的XIB类型为VC时,加载的注意点
代码布局有其便利之处,但是有时候部分布局需要重复使用,且结构比较复杂时,也可以使用XIb进行部分布局,此时封装一个viewcontroller类型的XIB可以节省后续很多维护的麻烦。但是使用XIB也会有一些地方需要注意,一不小心便要多花很多的时间来查找问题。此处列出部分遇到的问题,用于总结及日后查阅。
- 当创建的XIB的class为viewcontroller时,不只是需要在创建的ViewController上alloc\init,还要将XIB所在的Viewcontroller设为该控制器的子控制器:
[self addChildViewController:test]; //添加为当前控制器子控制器
控件设置圆角或圆形
在XIB的User Defined Runtime Attributes属性中添加以下两个Key Path:
//当cornerRadius的值为正方形控件二分之一时,
layer.cornerRadius-number-数值
layer.masksToBounds-bool-YES
为UIView的类创建XIB
我们可以为控制器创建配套的XIB,可是UIView上却不行,但是我们也可以通过一些特定的手段实现这一功能
选择XIB的View上的Custom Class的Class选项,将其改成和类名一样,在对应的类中实现以下方法:
+(CustomView *)AcquireCustomView
{
//我们这里需要把这个xib加载出来而这个xib的所拥有者就是当前的对象`instantiateWithOwner:`这个方法就是对此xib文件进行拥有者关联,关联这个xib是属于哪一个类的我们当然这是self
CustomView *View = [[UINib nibWithNibName:@"CustomView" bundle:nil]instantiateWithOwner:self options:nil].lastObject;
return View;
}
- 此处使用类似
+(CustomView *)allocWithCustomView的写法或是-(id)initWithXIB\[super init]两种做法都可以,实现UINib的方法及最后return类的实例即可。
在需要调用该类的地方实现以下方法:
CustomView * theCustomView = [[CustomView AcquireCustomView]init];
[self.view addSubview:theCustomView];
//约束
theCustomView.frame = CGRectMake(50, 100, 200, 200);
- XIB上的控件可直接连线到类并实现
参考链接: iOS 给UIView添加单独XIB文件
问题
XIB版本约束问题
顶部约束-XIB顶部适配
xib进行顶部约束时,iOS11约束在Safe Area时,会自动做顶部适配,如果有导航栏时会主动约束在导航栏下。而iOS11以下则不会,如果存在导航栏,则可能把内容遮盖住
- 这种情况可以给控件添加两个顶部约束:Safe Area和Super View;
- Safe Area的约束优先级设置得比Super View的低,而Super View的约束关系为
≥,则可适配各种版本的机型。 -
如下图。此处Super View的约束设为74是因为页面有导航栏,64+10=74。
Safe Area.png
Super View.png

