带有旋转 UI 元素的自动布局

Posted

技术标签:

【中文标题】带有旋转 UI 元素的自动布局【英文标题】:AutoLayout with rotated UI Elements 【发布时间】:2013-03-11 16:56:55 【问题描述】:

我一直在自学 Auto Layout 使用代码(即避免使用 Interface Builder)。

我想用Auto Layout 设置一个视图。

它有 3 个水平的 UILabels 和一个垂直的。

Sort of like this.
---------------------------------------------
| ---  -----------------------------------  |
| | |  |                                 |  |
| | |  -----------------------------------  |
| | |  -----------------------------------  |
| | |  |                                 |  |
| | |  -----------------------------------  |
| | |  -----------------------------------  |
| | |  |                                 |  |
| ---  -----------------------------------  |
---------------------------------------------

左侧的标签向左旋转 90 度。

我只是不确定如何在旋转标签和非旋转标签之间应用自动布局?

这个可以吗?

height 会变成widthtop 会变成left,等等...

【问题讨论】:

+1 好问题。如果您将“顶部”附加到 Superview(在 IB 中)并且您将视图旋转 90 度,那么约束是保持连接到旋转侧还是保持连接到新的“顶部”?如果是后者,您可以将视图放入 IB 中,在视图和右上角视图之间附加约束;然后在您的视图控制器中旋转。但我实际上并不知道这个问题的答案。 谢谢,我必须手动完成所有布局,但如果能得到答案并将所有布局放入自动布局中,那就太好了。 我想这一切都取决于约束(链接到框架)如何响应视图 CTM 的变化。我希望约束忽略 CTM 旋转。 【参考方案1】:

可能有一个“正确”的答案,但一个简单的解决方法是将旋转标签添加为非旋转视图的子视图,并使用这些视图进行布局。

更新:我只记得当视图应用了变换时,框架成为可能的最小边界框架*。除非我弄错了,否则这意味着框架正是您想要的,并且假设布局计算基于框架,它应该可以按预期工作。

* 当我上次使用转换视图时,旋转视图的框架是未定义的,但实验表明它是旋转视图的边界矩形。不确定现在是否已定义或明确允许/禁止。

更新 2:我检查了docs,他们仍然有强烈的警告,不要这样做:

警告:如果变换属性不是恒等变换,则该属性的值未定义,因此应被忽略。

【讨论】:

好的,不知道为什么我之前没有尝试过,但是我构建了一个小型测试项目广告,设置了主视图,就像我的问题中一样......效果很好。你说得对,AutoLayout“框架”实际上是旋转后视图的最小边界框。 我检查了文档,并用仍然存在的警告更新了我的答案。如果它有效,那就太好了,但每次有操作系统更新时都要仔细检查一下。

以上是关于带有旋转 UI 元素的自动布局的主要内容,如果未能解决你的问题,请参考以下文章

自动布局指南:UIImagePickerController W /自定义叠加不会旋转

自动布局:Xcode 6:居中 UI 元素

如何使用自动布局以编程方式快速设置旋转时 UICollectionView 的宽度

QT UI 使一个QWidget里面的元素自动填充满本QWidget

Xcode 7.3 (swift 2) 中的自动布局

修改已经使用自动布局布局的情节提要