我有一个名为sampleImage
的图片,我正试图将其展开到x
和y axis
,如下所示landscape
并且它不起作用在所有
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
{
if (UIDevice.current.orientation == UIDeviceOrientation.portrait)
{
sampleImage.frame = CGRect(x: 0, y: 0, width: 220, height: 120)
}
else
{
sampleImage.frame = CGRect(x: 0.2, y: 0.2, width: 220, height: 120)
}
}
然后,我在viewDidLayoutSubviews()
中做了如下,
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if (UIDevice.current.orientation == UIDeviceOrientation.portrait)
{
sampleImage.frame = CGRect(x: 0, y: 0, width: 220, height: 120)
}
else
{
sampleImage.frame = CGRect(x: 0.2, y: 0.2, width: 220, height: 120)
}
}
如果设备位于landscape
,则会有效,但是一旦将其旋转到portrait
并返回,所有更改都将消失。如何确保这些尺寸在旋转时保持相同?
答案 0 :(得分:3)
基本上,它都是关于constraints的。解决问题的第一种方法是处理设备轮换(good so answer)并通过setNeedsUpdateConstratints
方法(another good so answer)手动更改。这种方式适用于具有UI和约束的复杂变化的重型屏幕。在您的情况下,您最好使用特定常量作为约束基于可在故事板中设置的设备方向。
所以,请按照以下步骤操作:
将Equal Heights
和Equal Widths
约束设置为UIImageView
,然后双击Width Equals: 120
约束:
打开View as: iPhone ...
下栏:
选择右侧的特定设备和横向,然后点击右侧面板+
前的Constant
。
它将根据所选设备和方向自动设置Width
和Height
,因此您只需输入此情况的常量。运行项目并查看结果。
肖像:
风景:
注意,也不要忘记不同的设备可能有不同的大小类(紧凑的x紧凑,紧凑的x常规等),所以你可能需要添加更多的常量来处理这个问题({{ 3}})。
最后,您通过使用故事板而不是以编程方式解决了问题。优点 - 您的代码不会长大,也不会对UI事物负责,缺点 - 您应该将constant
添加到您想要使用的每个大小类中。