XIB相关方法

常用

创建的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 ClassClass选项,将其改成和类名一样,在对应的类中实现以下方法:


+(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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容