xib自定义,高度减少64

解决在导航栏不透明的情况下,自定义xib view高度被压缩64的问题

在使用xib自定义view的时候,个人习惯性的直接使用xib中的约束,所以自然而然的要打开Autolayout。以前在使用的时候没有发现什么问题,最近项目中使用的时候突然发现在导航栏透明的情况下,出现实际的frame比设置的frame高度缩小64的问题,然后上网查找各种博客,最后差点被五花八门的写法带跑偏了,遂简单记录一下正确的解决方式。

- (instancetype)initWithFrame:(CGRect)frame index:(NSInteger)index {
    
    self = [super initWithFrame:frame];
    if (self) {
        self = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil] objectAtIndex:index];
    }
    self.frame = frame;
    return self;
}

正常情况下在控制器的view中添加XibView实例view的时候是没有问题的,但是当我需要设置导航栏不透明的时候,需要用到这句代码:
self.navigationController.navigationBar.translucent = NO;
这时,问题出现,问题如下:(仅在控制器view是UIView类型的时候才会出现,当xib view添加到滚动视图上时不会有下面的问题)
  1、添加的view高度会缩减64
  2、同时控制台会打印约束冲突的情况
注意:(亲测automaticallyAdjustsScrollViewInsets,self.extendedLayoutIncludesOpaqueBars,edgesForExtendedLayout这些设置都解决不了这个问题)

解决:关闭Autoresize SubViews即可,控制器中的Autoresize SubViews不勾选,或者在viewdidload方法中添加下面代码,也能起到相同的效果

//最好用这个方法,如果在xib中关闭Autoresize SubViews的话,每个子视图也都要关闭Autoresize SubViews,比较麻烦
self.view.autoresizesSubviews = NO;

问题的分析:

实造成xib view高度缩小64像素以及会打印约束冲突的最根本原因是,我们在Xcode9上创建xib或者storyboard文件时,会默认打开Autoresize SubViews,所以在设置导航栏透明的时候,因为自动重新布局之后导致高度缩小,原来的xib中的约束无效。
既然问题查清楚了,那就对症下药,关闭Autoresize SubViews即可。

你可能感兴趣的:(xib自定义,高度减少64)