iOS 8 中 Nib 加载的子视图的位置不正确

Posted

技术标签:

【中文标题】iOS 8 中 Nib 加载的子视图的位置不正确【英文标题】:Position of Nib-loaded Subview incorrect in iOS 8 【发布时间】:2014-10-17 15:07:47 【问题描述】:

我有一个名为 CNJobMapView 的自定义类,它是 UIView 的子类。此自定义类从 nib 文件加载视图并将其添加为子视图。我这样做是为了可以将 UIView 对象添加到情节提要中的视图中,为其提供 CNJobMapView 自定义类,当我运行应用程序时它会出现在该视图中。

我在 CNJobMapView 的 awakeFromNib 方法中加载 nib,如下所示:

-(void)awakeFromNib 
  [[NSBundle mainBundle] loadNibNamed:@"CNJobMapView" owner:self options:nil];
  [self addSubview: self.contentView];
  [self internalSetup];

在这种情况下,self.contentView 是名为“CNJobMapView”的 nib 内的主视图。它是从 IB 链接的。

ios 7 和 7.1 中,这一切都可以正常工作。看起来像这样:

在 iOS 8 中,这不能正常工作。 contentView 出现在完全错误的位置。像这样:

我不知道为什么它在 iOS 8 中有所不同。我希望能得到一些帮助来解决这个问题!

【问题讨论】:

【参考方案1】:

我找到了答案!

显然在 iOS 7 中,它假定了将 contentView 放置在 CNJobMapView 中的正确约束。在 iOS 8 中,情况不再如此。我修改了awakeFromNib函数如下:

-(void)awakeFromNib 
  [[NSBundle mainBundle] loadNibNamed:@"CNJobMapView" owner:self options:nil];
  [self addSubview: self.contentView];
  [self internalSetup];

  NSDictionary *views = NSDictionaryOfVariableBindings(contentView);
  NSArray *horizContentConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:nil views:views];
  [self addConstraints:horizContentConstraints];
  NSArray *vertContentConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:views];
  [self addConstraints:vertContentConstraints];

现在问题已经解决了。

【讨论】:

以上是关于iOS 8 中 Nib 加载的子视图的位置不正确的主要内容,如果未能解决你的问题,请参考以下文章

对从 nib 加载的子视图应用阴影

如何显示从单独的 NIB 文件加载的子视图

为啥 iOS 不自动旋转从 Nib 加载的视图在被 didReceiveMemoryWarning 释放后?

iOS 从 nib 加载视图会造成内存泄漏?

iOS:加载没有 nib 文件的第二个视图控制器

为 UIView 子类加载 Nib 的正确方法