【问题标题】:initWithCoder shows wrong frame in iosinitWithCoder 在 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 或更高版本,一旦完整布局已经发生。

标签: ios iphone xcode autolayout uistoryboard


【解决方案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 之外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2016-07-05
    • 2015-07-08
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多