编程布局约束导致旋转不调整基本 UIView

Posted

技术标签:

【中文标题】编程布局约束导致旋转不调整基本 UIView【英文标题】:Programmatic layout constraints causes rotation not to resize base UIView 【发布时间】:2016-04-25 21:25:15 【问题描述】:

所以我正在创建一个包含两个元素的 UIViewController 子类:标题 UIView 和它下面的 UITableView。

----------------
||------------||
||Header View ||
||------------||
||------------||
|| Table View ||
||            ||
||            ||
||            ||
||------------||
----------------

我在初始化代码中给Header view和Table View添加约束如下:

- (void)setupHeaderView

    self.headerView.backgroundColor = [UIColor whiteColor];

    self.headerViewTopConstraint = [NSLayoutConstraint constraintWithItem:self.headerView
                                                                attribute:NSLayoutAttributeTop
                                                                relatedBy:NSLayoutRelationEqual
                                                                   toItem:self.view
                                                                attribute:NSLayoutAttributeTop
                                                               multiplier:1.0
                                                                 constant:0.0];
    self.headerViewLeadingConstraint = [NSLayoutConstraint constraintWithItem:self.headerView
                                                                    attribute:NSLayoutAttributeLeading
                                                                    relatedBy:NSLayoutRelationEqual
                                                                       toItem:self.view
                                                                    attribute:NSLayoutAttributeLeading
                                                                   multiplier:1.0
                                                                     constant:0.0];
    self.headerViewTrailingConstraint = [NSLayoutConstraint constraintWithItem:self.headerView
                                                                     attribute:NSLayoutAttributeTrailing
                                                                     relatedBy:NSLayoutRelationEqual
                                                                        toItem:self.view
                                                                     attribute:NSLayoutAttributeTrailing
                                                                    multiplier:1.0
                                                                      constant:0.0];
    self.headerViewHeightConstraint = [NSLayoutConstraint constraintWithItem:self.headerView
                                                                   attribute:NSLayoutAttributeHeight
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:nil
                                                                   attribute:NSLayoutAttributeNotAnAttribute
                                                                  multiplier:1.0
                                                                    constant:HeaderViewHeight];


- (void)setupTableView

    self.tableViewTopConstraint = [NSLayoutConstraint constraintWithItem:self.tableView
                                                               attribute:NSLayoutAttributeTop
                                                               relatedBy:NSLayoutRelationEqual
                                                                  toItem:self.headerView
                                                               attribute:NSLayoutAttributeBottom
                                                              multiplier:1.0
                                                                constant:0.0];
    self.tableViewLeadingConstraint = [NSLayoutConstraint constraintWithItem:self.tableView
                                                                   attribute:NSLayoutAttributeLeading
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:self.view
                                                                   attribute:NSLayoutAttributeLeading
                                                                  multiplier:1.0
                                                                    constant:0.0];
    self.tableViewTrailingConstraint = [NSLayoutConstraint constraintWithItem:self.tableView
                                                                    attribute:NSLayoutAttributeTrailing
                                                                    relatedBy:NSLayoutRelationEqual
                                                                       toItem:self.view
                                                                    attribute:NSLayoutAttributeTrailing
                                                                   multiplier:1.0
                                                                     constant:0.0];
    self.tableViewBottomConstraint = [NSLayoutConstraint constraintWithItem:self.tableView
                                                                  attribute:NSLayoutAttributeBottom
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:self.view
                                                                  attribute:NSLayoutAttributeBottom
                                                                 multiplier:1.0
                                                                   constant:0.0];

这两个视图被添加到 self.view 并在调用之前:

self.view.translatesAutoresizingMaskIntoConstraints = NO;

但主要问题是,在加载此视图并旋转设备/模拟器时,视图保持其纵向框架并保持其原点,因此设备窗口是水平的,但视图框架仍然是其纵向框架,导致它离开屏幕并在其旁边有一个空白的黑色空间:

提供的屏幕截图:

我如何保持传播到父视图以及随后传播到其子视图的方向变化?

【问题讨论】:

....我觉得自己像个白痴....那行得通。谢谢。如果您发表评论,我会将其标记为已回答。 【参考方案1】:

实际上,您应该将标题和表格视图的translatesAutoresizingMaskIntoConstraints 设置为NO

主视图的translatesAutoresizingMaskIntoConstraints 值应始终保持为YES

view.translatesAutoresizingMaskIntoConstraints = YES;
headerView.translatesAutoresizingMaskIntoConstraints = NO;
tableView.translatesAutoresizingMaskIntoConstraints = NO;

【讨论】:

以上是关于编程布局约束导致旋转不调整基本 UIView的主要内容,如果未能解决你的问题,请参考以下文章

如何在显示旋转时以编程方式更改布局约束

iOS - 在 Swift 3 中以编程方式删除和激活新约束时布局损坏

调整大小后使用自动布局以编程方式居中 UIImageVIew

当父容器视图约束以编程方式更改时,UINavigationController 子视图不调整大小

在屏幕旋转之前,自动布局约束不正确? [复制]

使用自动布局以编程方式调整标签宽度