【问题标题】:Rotating one view and leaving another unmoved in Swift / Xcode for iOS on orientation change在 Swift / Xcode for iOS 中旋转一个视图并保持另一个视图不变
【发布时间】:2016-02-23 12:44:11
【问题描述】:

我正在编写一个 iPhone 应用程序。对于我们故事板上的大多数场景,手机从纵向变为横向时的默认行为是可以的。 IE。这是我们想要的布局更改:

但是对于故事板中的一个场景,我不希望这种布局改变。相反,我想要这个:

我对如何实现后一种布局更改感到困惑。我可以使用大小类来确保工具栏的 100 像素间隙从底部(纵向)到右侧(横向)交换,但我无法弄清楚如何正确约束工具栏,特别是因为旋转需要在代码中发生,例如

switch (UIDevice.currentDevice().orientation) {
case UIDeviceOrientation.LandscapeLeft, UIDeviceOrientation.LandscapeRight:
    self.toolbarView.transform = CGAffineTransformMakeRotation(CGFloat(3 * M_PI_2))
    // Reposition toolbarView into space to the right of the content's view
    break
default:
    self.toolbarView.transform = CGAffineTransformIdentity
    break
}

我应该怎么做才能正确地重新定位工具栏?

【问题讨论】:

    标签: swift uistoryboard size-classes screen-rotation


    【解决方案1】:

    布局约束约束给定视图的frame。让我们看看文档中关于frame 和transform 属性之间相互作用的内容:

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

    ...

    如果 transform 属性包含非恒等变换,则 frame 属性的值未定义且不应修改。在这种情况下,您可以使用 center 属性重新定位视图,并使用 bounds 属性调整大小。

    https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instp/UIView/frame

    所以你不能通过 AutoLayout 做到这一点。您必须使用center 和bounds,并从代码中进行定位:

    -(void)layoutSubviews {
        [super layoutSubviews];
        self.toolbarView.center = ...
        self.toolbarView.bounds = ...
    }
    

    【讨论】:

    • 看起来不错。如何关闭项目的自动布局,以便您建议的 center 和 bounds 操作坚持?
    • 如果你使用storyboards/xibs,确保你选中了工具栏约束上的“remove at build time”复选框。这使您可以从代码中定位工具栏(因为在运行时工具栏上没有任何约束),并且还会使界面构建器警告静音(因为在界面构建器中,必要的约束仍然存在)。
    • self.toolbarView 实际上是一个具有自己的子视图的复合 UIView(另一个 UIView 带有一些文本和图像,一个是 UIToolbar)。已经承诺覆盖 layoutSubviews 以定位 self.toolbarView 我仍然可以在其子视图上使用自动布局,还是需要通过操作中心和边界来将它们全部布局?
    • 是的,您应该能够在包含的视图上使用自动布局。
    • 子视图树的自动布局似乎不起作用(叶子认为它们的超级视图的宽度为零)并且 UIToolbar 按钮不会触发它们的动作,除非它是全部自动布局。感谢您的帮助 - 这是一场噩梦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多