【问题标题】:Auto Layout view to fullscreen on rotate旋转时自动布局视图到全屏
【发布时间】:2013-11-20 04:18:29
【问题描述】:

我正在编写一个视频播放应用程序。该应用程序在以纵向模式观看时在视频下方具有有关该应用程序的信息,但是当该应用程序变为横向时,我希望视频全屏显示。不幸的是,当应用程序转为横向时,即使我将高度限制设置为优先级 == 1,底部视图也会限制视频视图从顶部一直扩展到底部。

人像模式:

横向模式:

我尝试隐藏下部视图,但是当我在旋转回纵向时显示视图时,这会使整个布局失控,因为隐藏视图会破坏与视图关联的约束。

有没有一种方法可以让单个视图轻松占据整个屏幕并恢复到使用自动布局轻松实现的方式?

谢谢。

【问题讨论】:

    标签: ios iphone objective-c autolayout avplayer


    【解决方案1】:

    是的,有一个简单的方法,但您需要做一些数学运算。您可以使用 multiplier 和 constant 属性将视频视图的高度与超级视图相关联。你可以有两个方程来定义你想要的,并求解变量。例如,假设您希望纵向高度为 225(在 568 点高的屏幕中),横向高度为 320。这给了你这两个方程(换句话说,方程说,“我希望我的高度等于 self.view 的高度乘以一个乘数加上一个常数”):

    225 = 568m + 常数和 320 = 320m + 常数

    如果你求解这两个方程,你会得到 -0.3831 的 m 和 442.6 的常数。 所以,在 IB 中,你应该给你的视频视图一个高度限制,并为它创建一个 IBOutlet。其他视图也可能有高度限制(但可能还有其他方法),但重要的是您希望它们彼此之间有垂直间距限制,以便将它们捆绑在一起,并且对视图底部没有限制。这样,当视频视图扩展时,它会将其他两个视图推离屏幕。在代码中,你会这样做:

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.topView removeConstraint:self.heightCon];
        [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.topView attribute:NSLayoutAttributeHeight relatedBy:0 toItem:self.view attribute:NSLayoutAttributeHeight multiplier:-.3831 constant:442.6]];
    }
    

    heightCon 是我对 topView(您的视频视图)高度约束的出口。我们将其删除,然后将其替换为 self.view 中正确关联两个高度的一个。如果您支持两种屏幕尺寸,则必须在第一个方程中使用 480 而不是 568 来求解方程,并根据设备添加正确的约束。旋转时不需要做任何事情,约束系统会自动处理。

    【讨论】:

    • 嗨,就是这样。感谢您完美的回答。我以前没想过为我的约束设置 IBOutlets。这个问题教会了我很多关于 NSConstraints 和 Auto layout 的知识,你的回答是我进一步理解的一部分。非常感谢您花时间回答我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2011-07-10
    • 2012-10-14
    相关资源
    最近更新 更多