在横向调整和放置旋转视图:更新约束或平移/更改框架?
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 中纵向的约束和我为横向设置的编程约束 你能列出你使用的所有约束吗?以上是关于在横向调整和放置旋转视图:更新约束或平移/更改框架?的主要内容,如果未能解决你的问题,请参考以下文章