Swift中iOS7和iOS8 / iOS9上的仿射变换缩放比例不同

我在Swift中使用了scale仿射变换,并且注意到CGAffineTransformMakeScale在所有的iOS版本上都不起作用。 为了演示这些差异,我创build了一个新的Xcode 7项目,在iOS7设备,iOS8模拟器和iOS9模拟器上运行的Xcode Storyboard上设置了三个testing框。

方框A – 没有限制,位于故事板的中心位置

方框B – 具有与中心水平和中心垂直alignment约束一起设置的高度和宽度。

方框C – 具有高度和宽度以及底部空间和中心水平alignment限制。

然后使用下面的代码将盒子缩放到0.5。

注意:粉红色区域不是盒子或容器,而是用于在发生比例仿射变换之后突出显示蓝色框的位置。

结果:

iOS7存在问题,而所有的盒子都减半了,两个盒子A和C不会居中。

iOS8 / iOS9按预期工作 – 无论是否应用约束,所有盒子都将其大小减半并保持居中。

问题:

是什么导致了这个问题,怎么才能最好地纠正和解决,使所有的iOS7 / 8/9版本工作相同?


iOS7上的CGAffineTransformMakeScale – 不按预期缩放:-(

在这里输入图像说明

iOS8 / iOS9 CGAffineTransformMakeScale – 按预期缩放:-)

在这里输入图像说明


码:

 import UIKit class ViewController: UIViewController { @IBOutlet weak var ButtonA: UIButton! @IBOutlet weak var ButtonB: UIButton! @IBOutlet weak var ButtonC: UIButton! @IBAction func ButtonScale(sender: AnyObject) { self.ButtonA.transform = CGAffineTransformMakeScale(0.5, 0.5) self.ButtonB.transform = CGAffineTransformMakeScale(0.5, 0.5) self.ButtonC.transform = CGAffineTransformMakeScale(0.5, 0.5) } override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } 

这是由约束和转换描述- 自动布局如何悄悄变得友好的iOS 8 。

基本上,在iOS7和更旧版本中,您不应该对变换的不同侧上的值设置约束。