在使用CGAffineTransform旋转后更新UIImageView帧时出现奇怪的压缩

时间:2017-08-20 01:55:40

标签: ios swift uiimageview rotation

我的主视图中有两个按钮和一个UIImageView。一个按钮尝试将UIImageView旋转30度,另一个按钮将UIImageView的帧更新为自身。

我不希望将框架设置为自己以在视觉上影响任何东西,但它反而似乎"挤压"如果图像处于默认方向以外的任何旋转中。我偶然发现了这一点,因为我想更新UIImageView的框架,以便在旋转后更改其x和y坐标。

因此,只要我从不按下更新框架按钮,旋转按钮似乎工作正常。但是,如果我在旋转视图的同时按下第二个按钮,它会将图像调整为我不理解或知道如何撤消的状态。

第二个按钮的视频"压扁"图片: https://streamable.com/ba7zd

仅第二个按钮的视频"压扁"旋转不是默认方向:https://streamable.com/vo3cd

发生这种情况的原因是什么? This questionthis question似乎都捕获了类似的情况,但我不确定如何应用这两种解决方案。

在ViewController中:

@IBOutlet weak var dog: UIImageView!

@IBAction func breakRotate(_ sender: UIButton) {
    self.dog.frame = self.dog.frame  // squishes if rotated
}

@IBAction func rotateDog(_ sender: UIButton) {
    UIView.animate(withDuration: 1.5, delay: 0, options: [.allowUserInteraction], animations: {
        self.dog!.transform = self.dog!.transform.rotated(by: CGFloat(0.523599))  // 30 degrees in radians
    })
}

图像:

enter image description here

1 个答案:

答案 0 :(得分:2)

应用旋转后从frame属性返回的值不是旋转的帧,它是包围视图的最小边界矩形,其大小可以与实际帧不同。 ( documentation表示框架将是未定义的,应该被忽略,但实际上它将返回最小边界矩形

将变换应用于视图时,不应更改帧,因为它可能会干扰变换。

如果要在转换后更改位置,则应更改视图的center属性:

dog.center = newCenterPoint

最后,为什么你会看到这种不寻常的效果,当你进行变换时,它会自动将帧的大小调整到新的最小边界矩形而不会弄乱图像的大小,但是当你应用新的更改帧时回到视图时,它不会知道这是转换的结果,并会尝试调整图像大小,这就是为什么你的图像会像这样被压扁。