如何使 "freeform" UIViewController 适应多种屏幕尺寸?
How to fit a "freeform" UIViewController to multiple screen sizes?
我创建了几个自由形式的 UIViewControllers,它们具有用于滚动目的的超长高度,以及等于 iPhone 8 Plus 屏幕宽度的宽度(因为这是我拥有的物理设备)可用于测试)。
当我试图让我的应用程序在所有设备上运行时,即使是 iPhone SE 大小的屏幕,我的问题也来了。高度不是问题,但宽度会造成问题,因为在较小的屏幕尺寸上。
UIViewController明显比屏幕宽。因此,它允许水平 scrolling/panning。但是,我的目标是让 ViewController 与所用屏幕的宽度相匹配。所以,只有垂直滚动是可能的。
我试图在显示时调整 UIViewController 的宽度,但这似乎没有效果。我真的不确定还能尝试什么,也无法在网上找到任何相关信息。这是一个明显的修复还是我做错了什么?
我认为您可能将 UIViewController 误认为是视图。如果您的视图是滚动视图,您可以将滚动视图的内容大小设置为与您设备的宽度相同,应该可以达到预期的效果。
在Swift3.0及更高版本中:
let screenWidth = UIScreen.main.bounds.width
yourScrollView.contentSize.width = screenWidth
要支持多种宽度,您可以使用 iOS 中可用的不同尺寸 类。
size-class 相关约束有很多教程。
喜欢https://www.bignerdranch.com/blog/designing-for-size-classes-in-ios/,
https://www.bignerdranch.com/blog/designing-for-size-classes-in-ios/
如果可能的话,您应该为您的设计提供与其父视图相关的视图约束。
I've tried to adjust the width of the UIViewController when it gets presented
"presenting" 你是说 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()
}
为了正确回答这个问题以及其他可能遇到这个问题的人。
视图控制器的大小会自动调整到屏幕大小(前提是其配置正确)。
如果您在视图控制器中有一个滚动视图,那么您应该使用自动布局约束确保滚动视图的边缘附加到其父视图(视图控制器的根视图)。
此外,scrollview内容必须设置为使用根视图作为位置参考(至少是水平方向)否则自动布局将不知道如何处理水平定位。
要完成此操作,您只需将内部视图(填充整个滚动视图)附加到 视图控制器的根视图 的左右边缘。
我创建了几个自由形式的 UIViewControllers,它们具有用于滚动目的的超长高度,以及等于 iPhone 8 Plus 屏幕宽度的宽度(因为这是我拥有的物理设备)可用于测试)。
当我试图让我的应用程序在所有设备上运行时,即使是 iPhone SE 大小的屏幕,我的问题也来了。高度不是问题,但宽度会造成问题,因为在较小的屏幕尺寸上。
UIViewController明显比屏幕宽。因此,它允许水平 scrolling/panning。但是,我的目标是让 ViewController 与所用屏幕的宽度相匹配。所以,只有垂直滚动是可能的。
我试图在显示时调整 UIViewController 的宽度,但这似乎没有效果。我真的不确定还能尝试什么,也无法在网上找到任何相关信息。这是一个明显的修复还是我做错了什么?
我认为您可能将 UIViewController 误认为是视图。如果您的视图是滚动视图,您可以将滚动视图的内容大小设置为与您设备的宽度相同,应该可以达到预期的效果。
在Swift3.0及更高版本中:
let screenWidth = UIScreen.main.bounds.width
yourScrollView.contentSize.width = screenWidth
要支持多种宽度,您可以使用 iOS 中可用的不同尺寸 类。 size-class 相关约束有很多教程。
喜欢https://www.bignerdranch.com/blog/designing-for-size-classes-in-ios/, https://www.bignerdranch.com/blog/designing-for-size-classes-in-ios/
如果可能的话,您应该为您的设计提供与其父视图相关的视图约束。
I've tried to adjust the width of the UIViewController when it gets presented
"presenting" 你是说 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()
}
为了正确回答这个问题以及其他可能遇到这个问题的人。
视图控制器的大小会自动调整到屏幕大小(前提是其配置正确)。
如果您在视图控制器中有一个滚动视图,那么您应该使用自动布局约束确保滚动视图的边缘附加到其父视图(视图控制器的根视图)。
此外,scrollview内容必须设置为使用根视图作为位置参考(至少是水平方向)否则自动布局将不知道如何处理水平定位。
要完成此操作,您只需将内部视图(填充整个滚动视图)附加到 视图控制器的根视图 的左右边缘。