在横向调整和放置旋转视图:更新约束或平移/更改框架?

Posted

技术标签:

【中文标题】在横向调整和放置旋转视图:更新约束或平移/更改框架?【英文标题】:Resizing and placing a rotated view in landscape: updating constraints or translating/changing frames? 【发布时间】:2015-06-26 10:34:28 【问题描述】:

我有一个纵向放置在屏幕底部的子视图:

我在storyboard 中为此方向设置了约束,以将其前导、尾随和底部空间固定到父视图,以及子视图的固定高度。

当设备处于横向时,我希望这个子视图位于屏幕的右侧,如下所示:

在我后面的UIViewController 子类中,我对viewWillTransitionToSize:withTransitionCoordinator: 中的子视图应用了M_PI/2 弧度旋转,然后我得到了这个结果:

我尝试根据需要将子视图放置在屏幕的右侧,因此在旋转后我调用[self.view setNeedsUpdateConstraints]; 并尝试为此方向设置新的约束,但我无法获得结果想。所以,我不确定我是否试图做错事......我认为设置新的约束以将子视图固定到屏幕的右侧,会调整它的高度并刷新它的 X 和 Y 值。 .. 或者正确的方法是平移旋转的子视图并更改其框架?

我该如何解决这个问题?

谢谢

编辑:这是我以编程方式为横向设置的约束示例:

NSLayoutConstraint *customSubviewConstraintTop = [NSLayoutConstraint constraintWithItem:self.customSubview
         attribute:NSLayoutAttributeLeading
         relatedBy:NSLayoutRelationEqual
         toItem:self.view
         attribute:NSLayoutAttributeLeading
         multiplier:1.0
         constant:0];

这应该将子视图的顶部(旋转前的左侧)固定到屏幕顶部(纵向时屏幕的右侧)...对吗?

编辑 2:这是我在updateViewConstraints 中用于横向约束的代码:

if (!isPortrait) 

    self.customSubView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI/2);

    [self.view removeConstraint:self.customSubViewConstraintL];
    [self.view removeConstraint:self.customSubViewConstraintR];
    [self.view removeConstraint:self.customSubViewConstraintB];
    [self.view removeConstraint:self.customSubViewConstraintH];

    [self.customSubView setTranslatesAutoresizingMaskIntoConstraints:NO];

    self.customSubViewConstraintH = [NSLayoutConstraint constraintWithItem:self.customSubView
                                                          attribute:NSLayoutAttributeWidth
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:nil
                                                          attribute:NSLayoutAttributeNotAnAttribute
                                                         multiplier:1.0
                                                           constant:35.0];

    self.customSubViewConstraintL = [NSLayoutConstraint constraintWithItem:self.customSubView
                                                          attribute:NSLayoutAttributeLeading
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeLeading
                                                         multiplier:1.0
                                                           constant:0.0];

    self.customSubViewConstraintR = [NSLayoutConstraint constraintWithItem:self.customSubView
                                                          attribute:NSLayoutAttributeTrailing
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeTrailing
                                                         multiplier:1.0
                                                           constant:0.0];

    self.customSubViewConstraintB = [NSLayoutConstraint constraintWithItem:self.customSubView
                                                          attribute:NSLayoutAttributeBottom
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeBottom
                                                         multiplier:1.0
                                                           constant:0.0];

    [self.view addConstraint:self.customSubViewConstraintH];
    [self.view addConstraint:self.customSubViewConstraintL];
    [self.view addConstraint:self.customSubViewConstraintR];
    [self.view addConstraint:self.customSubViewConstraintB];

【问题讨论】:

【参考方案1】:

您可能会使用屏幕边界约束,例如 BottomLayoutGuide。请改用垂直间距。

UPD:问题是您在viewWillTransitionToSize:withTransitionCoordinator: 中为自定义视图设置了旋转。只需设置所需的高度和宽度即可。

【讨论】:

我已将它们设置为超级视图,包括 Interface Builder 中纵向的约束和我为横向设置的编程约束 你能列出你使用的所有约束吗?

以上是关于在横向调整和放置旋转视图:更新约束或平移/更改框架?的主要内容,如果未能解决你的问题,请参考以下文章

更改方向的自动布局约束

根据设备方向快速更改约束

将视图层次结构旋转 90 度

使用平移手势平滑地更改动画约束

使用自动布局和约束更改位置

自动布局 [Snapkit] 更改旋转约束