如何将“自由格式” UIViewController设置为多个屏幕尺寸?

时间:2019-05-17 01:40:27

标签: ios swift autolayout

我创建了多个自由形式的UIViewControllers,这些UIViewControllers具有用于滚动目的的超长高度,其宽度等于iPhone 8 Plus屏幕的宽度(因为这是我可以用来测试的物理设备)。

当我试图使我的应用程序在所有设备上运行至iPhone SE大小的屏幕时,都会出现问题。高度不是问题,但是宽度会造成问题,因为屏幕尺寸较小。

UIViewController显然比屏幕宽。因此,它允许水平滚动/平移。但是,我的目标是使ViewController匹配正在使用的屏幕的宽度。因此,只能进行垂直滚动。

我试图在显示UIViewController时调整其宽度,但这似乎没有效果。我真的不确定还有什么可以尝试的,并且在网上找不到任何东西。这是明显的解决方法还是我做的事情完全错误?

4 个答案:

答案 0 :(得分:0)

我认为您可能会误将您的 UIViewController 与视图一起使用。如果您的视图是滚动视图,则可以将滚动视图的内容大小设置为与设备的宽度相同,这样就可以达到预期的效果。

Swift 3.0 及更高版本中:

let screenWidth = UIScreen.main.bounds.width
yourScrollView.contentSize.width = screenWidth

答案 1 :(得分:0)

要支持多种宽度,您可以使用iOS中可用的不同尺寸类别。 有许多针对尺寸类相关约束的教程。

https://www.bignerdranch.com/blog/designing-for-size-classes-in-ios/一样, https://www.bignerdranch.com/blog/designing-for-size-classes-in-ios/

如果可能,对于您的设计,您必须提供View与其父视图有关的约束。

答案 2 :(得分:0)

  

我尝试调整UIViewController的宽度在显示时

“呈现”是指viewDidLoad方法吗?我认为这不是调整宽度的最佳位置,因为目前尚不知道视图范围。旋转设备时,不会调用viewDidLoad之外的方法。

我想您应该在viewDidLayoutSubviews中更新滚动视图宽度,每次在视图控制器中更改根视图范围时都会调用该滚动视图宽度:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let screenWidth = UIScreen.main.bounds.width
    yourScrollView.contentSize.width = screenWidth  

    // I don't think you really need it 
    // but it may help
    yourScrollView.setNeedsLayout()
} 

答案 3 :(得分:0)

要正确回答此问题以及可能会遇到此问题的其他人。

视图控制器的大小会自动调整为屏幕大小(前提是其配置正确)。

如果在视图控制器内部具有滚动视图,则应确保使用自动布局约束将滚动视图的边缘附加到其父视图(视图控制器的根视图)。

此外,必须将滚动视图的内容设置为将根视图用作位置参考(至少水平),否则自动布局将不知道如何处理水平定位。

要实现此目的,您只需将内部视图(填充整个滚动视图)附加到视图控制器的根视图的左右边缘。