实现这一布局,使用自动布局一个视图 - 控制(Achieving this layout for a

2019-10-29 21:10发布

我工作的一个视图控制器,我想尽量做到像下面的图片。 我想这样做,所以它在任何设备上看起来不错至于宽高比。

顶部是一个容器,中间是一个的CollectionView,并且底部是一个UITableView。 我想要保持的是纵横比。 我想这样做是以下几点:

  1. 对于第一个中,设置前置,和顶部边缘是到容器(准则)。 将底部有一个是下面的框(较大的中框)。 设定纵横比为好。
  2. 对于中框,设置前/后利润的准则,底部设置下面的方框中。 还设定纵横比。
  3. 对于最后一个中,设置前置,底部(该准则)以及纵横比。
  4. 我还设置引脚宽度相等

这样做了以后,它正确地保留我的比率,但它抛出一吨的错误和警告。 任何想法,为什么会在我胡思乱想? 破碎声/警告报告:

Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7f8a66031bc0 V:[UITableView:0x7f8a65837c00(73)]>",
    "<NSLayoutConstraint:0x7f8a6605c150 UITableView:0x7f8a65837c00.width == 7.78082*UITableView:0x7f8a65837c00.height>",
    "<NSLayoutConstraint:0x7f8a6604e970 UICollectionView:0x7f8a65838400.leading == UIView:0x7f8a66031eb0.leadingMargin>",
    "<NSLayoutConstraint:0x7f8a6604e9c0 UICollectionView:0x7f8a65838400.trailing == UIView:0x7f8a66031eb0.trailingMargin>",
    "<NSLayoutConstraint:0x7f8a6604ea10 UICollectionView:0x7f8a65838400.width == UITableView:0x7f8a65837c00.width>",
    "<NSLayoutConstraint:0x7f8a63c4ccf0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7f8a66031eb0(320)]>"
)

非常感谢!

Answer 1:

再说了,你要顶视图的身高是主视图和中间视图的高度的20%,是主要的观点的50%。 您可以通过编程做到这一点是这样的:

[topView setTranslatesAutoresizingMaskIntoConstraints: NO];
[middleView setTranslatesAutoresizingMaskIntoConstraints: NO];
[bottomView setTranslatesAutoresizingMaskIntoConstraints: NO];

NSDictionary *views = @{@"topView": topView, @"middleView": middleView, @"bottomView": bottomView};

[self.view addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"H:|[topView]|" options: 0 metrics: nil views: views]];
[self.view addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"H:|[middleView]|" options: 0 metrics: nil views: views]];
[self.view addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"H:|[bottomView]|" options: 0 metrics: nil views: views]];

[self.view addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"V:|[topView][middleView][bottomView]|" options: 0 metrics: nil views: views]];

[self.view addConstraint: [NSLayoutConstraint constraintWithItem: topView attribute: NSLayoutAttributeHeight relatedBy: NSLayoutRelationEqual toItem: self.view attribute: NSLayoutAttributeHeight multiplier: 0.2f constant: 0.0f]];
[self.view addConstraint: [NSLayoutConstraint constraintWithItem: middleView attribute: NSLayoutAttributeHeight relatedBy: NSLayoutRelationEqual toItem: self.view attribute: NSLayoutAttributeHeight multiplier: 0.5f constant: 0.0f]];

你不必为底视图设置方面高度。 你只需要PIN码才能与主视图的底部边缘的仰视图。

如果你想在Interface Builder做,你可以这样说:

  1. 对于机顶盒,添加“龙头”,“尾随”,并在上海华“顶”的制约。 此外,添加“相等的高度”约束到上海华和修改乘数为所需的值(参考最后一个图像)。
  2. 对于中框,添加“龙头”和“尾随”约束到上海华。 加入“顶”约束到机顶盒。 此外,添加“相等的高度”约束到上海华和修改倍频到所需的值。
  3. 在过去的框中添加“龙头”,“尾随”和“底”约束到上海华。 加入“顶”约束到中间的方框。










文章来源: Achieving this layout for a viewcontroller using autolayout