【问题标题】:Image dimensions changing on rotation图像尺寸随旋转而变化
【发布时间】:2018-06-15 04:21:45
【问题描述】:

我有一个名为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 并返回,所有更改都将消失。如何确保这些尺寸在旋转时保持不变?

【问题讨论】:

  • 需要注意的一点是,在 viewWillTransition 方法中,当您获得当前方向时,您将获得设备旋转之前的方向。
  • 那么如何检测方向变化呢?
  • 您没有检测到方向变化。 UIViewController 会收到大小更改和大小类更改的通知。请记住,旋转设备并不是 UIViewController 唯一可以改变大小的时候。你应该尽量避免考虑方向。话虽如此,您可以检查新尺寸的宽度与高度。在横向类型方向中,宽度较大,但在纵向类型方向中,高度较大。
  • 感谢您的解释,这比在 x 和 y 轴上拉伸要好

标签: ios swift xcode uiimageview uiimage


【解决方案1】:

基本上,都是关于constraints。解决问题的第一种方法是处理设备旋转 (good so answer) 并通过 setNeedsUpdateConstratints 方法 (another good so answer) 手动更改它。这种方式适用于 UI 和约束进行复杂更改的重屏幕。在您的情况下,您最好根据可以在情节提要中设置的设备方向使用特定常量进行约束。

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

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

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

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

它会根据选择的设备和方向自动设置正确的WidthHeight,所以你只需要在这种情况下输入常量。运行项目并查看结果。

纵向:

风景:

注意,也不要忘记不同的设备可能有不同的尺寸等级(紧凑 x 紧凑,紧凑 x 常规等),所以也许您需要添加更多常量来处理这个问题(see the table at the bottom of the article) .

最后,您通过使用情节提要解决了这个问题,而不是通过编程方式。这样做的优点 - 你的代码不会长大并且不负责 UI 的事情,缺点 - 你应该将 constant 添加到你想要使用的每个大小类中。

【讨论】:

  • 在我的情况下,约束不起作用,我想知道如何在旋转后保持拉伸尺寸不变。
  • 为什么约束对你不起作用。您可以设置约束以保持宽度、高度甚至纵横比不变,并且只允许更改位置。
  • @pacification,你的回答比我想的要好得多。欣赏它。
猜你喜欢
  • 2013-11-22
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多