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


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


    自定义方法大致如下:

    1、xib 和TestXibView是绑定的

    2、xib中如下图:(Autolayout开启的)

    3、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];
    }

    问题:

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

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

        self.navigationController.navigationBar.translucent = NO;

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

      1、添加的view高度会缩减64

      2、同时控制台会打印约束冲突的情况

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

    解决办法1:(偏门)

      最初在没有找到造成这种问题的原因的情况下,我只能把设置frame的相关demo写在这个方法中viewDidLayoutSubviews,虽然用着别扭,但是至少可以临时解决问题。

    - (void)viewDidLayoutSubviews{
     
        [super viewDidLayoutSubviews];
    
    }

      

    解决办法2、关闭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];
  • 相关阅读:
    C#开发ActiveX可行性研究 简单飞扬
    有几件事情 简单飞扬
    1 简单飞扬
    宁静 会一直存在么 简单飞扬
    java 项目中遇到的错误 简单飞扬
    开发线程安全的Spring Web应用(转) 简单飞扬
    p2p网站即时通信 简单飞扬
    游戏外挂原理和技术分析(关于魔力宝贝) 简单飞扬
    关于java使用javacomm20win32实践总结 (转) 简单飞扬
    Java 串口编程 简单飞扬
  • 原文地址:https://www.cnblogs.com/sunjianfei/p/7879199.html
Copyright © 2020-2023  润新知