initWithCoder 在 ios 中显示错误的帧

Posted

技术标签:

【中文标题】initWithCoder 在 ios 中显示错误的帧【英文标题】:initWithCoder shows wrong frame in ios 【发布时间】:2015-06-11 10:51:49 【问题描述】:

我在我的项目中使用故事板。 Storyboard 有一个带有自动布局的自定义视图。

CustomView.h

-(id)initWithCoder:(NSCoder *)aDecoder

    self = [super initWithCoder:aDecoder];
    if (self) 

        NSLog (@"view: %f", self.frame.size.width);   //Returns wrong
        NSLog (@"view: %f", self.bounds.size.width);  //Returns wrong

return self;

如果我运行应用程序,它会显示错误的帧。

帮我解决这个问题

【问题讨论】:

“错误”是什么意思?你期待什么,你得到了什么? @justMartin,如果我在 iPhone6 中运行,那么它应该返回 375 而不是 320。 与什么相比错了?您的意思是您的视图在 Interface Builder 和实际设备/模拟器上看起来不同吗? @NKorotkov,如果我在 iPhone6 中运行,那么它应该返回 375 而不是 320 鉴于视图的框架依赖于它是其子视图的视图以及整个视图层次结构中的约束设置,获取框架大小的唯一安全位置是从viewWillAppear 或更高版本,一旦完整布局已经发生。 【参考方案1】:

因为在initWithCoder 中,constraints 尚未应用于视图。

例子:

代码

-(void)viewDidAppear:(BOOL)animated
    NSLog (@"viewDidAppear: %f", self.testview.frame.size.width);

-(void)viewDidLayoutSubviews
    NSLog (@"viewDidLayoutSubviews: %f", self.testview.frame.size.width);

-(void)awakeFromNib
    NSLog (@"awakeFromNib: %f", self.testview.frame.size.width);

-(instancetype)initWithCoder:(NSCoder *)aDecoder
    if (self = [super initWithCoder:aDecoder]) 
        NSLog (@"initWithCoder: %f", self.testview.frame.size.width);
    
    return self;

并记录

2015-06-11 19:09:27.647 OCTest[717:20692] initWithCoder: 0.000000
2015-06-11 19:09:27.649 OCTest[717:20692] awakeFromNib: 0.000000
2015-06-11 19:09:27.696 OCTest[717:20692] viewDidLayoutSubviews: 320.000000
2015-06-11 19:09:27.746 OCTest[717:20692] viewDidAppear: 320.000000

【讨论】:

我使用了自定义视图,即 UIVIew 的子类 & viewDidLayoutSubviews 未在其中调用。 我知道了。只是从UIViewController方面告诉你,在initWithCoder中,获取frame还为时过早。 超级视图布局子视图时,应用约束。只有在那之后,你才能得到正确的框架 那么,如何直接从故事板加载自定义视图【参考方案2】:

我遇到了同样的问题,如果你想在 InitWithCoder 方法中获取屏幕大小 - 就这样吧

CGFloat x = [UIScreen mainScreen].bounds.size.width;
CGFloat y = [UIScreen mainScreen].bounds.size.height;

不是来自 UIView 仍然不存在的边界,而是在 UIScreen 之外。

【讨论】:

以上是关于initWithCoder 在 ios 中显示错误的帧的主要内容,如果未能解决你的问题,请参考以下文章

iOS既没有调用init也没有调用initWithCoder [关闭]

iOS - (instancetype)initWithCoder:(NSCoder *)aDecoder采坑小记

如何 initwithCoder 和 encodewithCoder 获取指针的值

为啥出口不能在 initWithCoder 中初始化?

我应该在这里使用awakeFromNib还是initWithCoder?

你在哪里设置子视图的图层属性?为啥不在 initWithCoder 中