图像尺寸随旋转而变化

时间:2018-01-05 10:58:20

标签: ios swift xcode uiimageview uiimage

我有一个名为sampleImage的图片,我正试图将其展开到xy 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并返回,所有更改都将消失。如何确保这些尺寸在旋转时保持相同?

1 个答案:

答案 0 :(得分:3)

基本上,它都是关于constraints的。解决问题的第一种方法是处理设备轮换(good so answer)并通过setNeedsUpdateConstratints方法(another good so answer)手动更改。这种方式适用于具有UI和约束的复杂变化的重型屏幕。在您的情况下,您最好使用特定常量作为约束基于可在故事板中设置的设备方向。

所以,请按照以下步骤操作:

Equal HeightsEqual Widths约束设置为UIImageView,然后双击Width Equals: 120约束:

enter image description here

打开View as: iPhone ...下栏:

enter image description here

选择右侧的特定设备和横向,然后点击右侧面板+前的Constant

enter image description here

它将根据所选设备和方向自动设置WidthHeight,因此您只需输入此情况的常量。运行项目并查看结果。

肖像:

enter image description here

风景:

enter image description here

注意,也不要忘记不同的设备可能有不同的大小类(紧凑的x紧凑,紧凑的x常规等),所以你可能需要添加更多的常量来处理这个问题({{ 3}})。

最后,您通过使用故事板而不是以编程方式解决了问题。优点 - 您的代码不会长大,也不会对UI事物负责,缺点 - 您应该将constant添加到您想要使用的每个大小类中。