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

 

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

 


自定义方法大体以下:

一、xib 和TestXibView是绑定的

二、xib中以下图:(Autolayout开启的)

 

三、TestXibView.m中主要代码以下:(是使用等号定义的)

- (instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor redColor]; NSArray *xib = [[NSBundle mainBundle] loadNibNamed:@"TestXibView" owner:nil options:nil]; self = xib.lastObject;//注意这里我使用的是“=” self.frame = frame; } return self; } - (void)awakeFromNib{ [super awakeFromNib]; }

 

问题:spa

正常状况下在控制器的view中添加TestXibView实例view的时候是没有问题的,3d

可是当我须要设置导航栏不透明的时候,须要用到这句代码:code

    self.navigationController.navigationBar.translucent = NO;

这时,问题出现,问题以下:(仅在控制器view是UIView类型的时候才会出现,当xib view添加到滚动视图上时不会有下面的问题orm

  一、添加的view高度会缩减64blog

  二、同时控制台会打印约束冲突的状况博客

注意:(亲测automaticallyAdjustsScrollViewInsets,self.extendedLayoutIncludesOpaqueBars,edgesForExtendedLayout这些设置都解决不了这个问题)it

 

解决办法1:(偏门)io

  最初在没有找到形成这种问题的缘由的状况下,我只能把设置frame的相关demo写在这个方法中viewDidLayoutSubviews,虽然用着别扭,可是至少能够临时解决问题。ast

- (void)viewDidLayoutSubviews{
 
    [super viewDidLayoutSubviews];

}

  

 

解决办法二、关闭Autoresize SubViews(正解)

  控制器中的Autoresize SubViews不勾选

 

  或者在viewdidload方法中添加下面代码,也能起到相同的效果:

    self.view.autoresizesSubviews = NO;

  

 

问题的分析:

  其实形成xib view高度缩小64像素以及会打印约束冲突的最根本缘由是,咱们在Xcode9上建立xib或者storyboard文件时,会默认打开Autoresize SubViews,因此在设置导航栏透明的时候,由于自动从新布局以后致使高度缩小,原来的xib中的约束无效。

  既然问题查清楚了,那就对症下药,关闭Autoresize SubViews便可。

  其实本身写的代码,出错了,网上的不少办法只能是参考,由于错误的前提或者环境可能差异很大,因此,出现bug时,首先仔细认真的检查本身的代码是否存在问题,在确保没问题(或者本身没有找到问题)的状况下能够去参考网上的一些解决办法。可是最终仍是要对症下药,了解病症所在才能真正的解决办法。

    

    

 

其它赘述:固然在xib不绑定TextXibView状况下,直接使用xib,也就是下面的方法

  NSArray *arr=[[NSBundle mainBundle]loadNibNamed:@"TestXibView" owner:nil options:nil];
    UIView *tmpView = arr.lastObject;
    tmpView.frame = CGRectMake(0, 300, 100, 100);
    [self.view addSubview:tmpView];
相关文章
相关标签/搜索