在Swift中的iOS7和iOS8 / iOS9上,缩放仿射变换的缩放方式不同

时间:2016-02-04 17:06:02

标签: ios swift scaling cgaffinetransform

我在Swift中使用了缩放仿射变换,并注意到CGAffineTransformMakeScale在所有iOS版本上都不起作用。为了证明这些差异,我创建了一个新的Xcode 7项目,在iOS7设备,iOS8模拟器和iOS9模拟器上运行的Xcode Storyboard上设置了三个测试盒。

方框A - 没有应用约束,位于故事板的中心顶部

方框B - 设置高度和宽度以及中心水平和中心垂直对齐约束。

方框C - 设置高度和宽度以及底部空间和中心水平对齐约束。

然后使用以下代码将框缩放为0.5。

注意:粉色区域不是框或容器,但用于在进行比例仿射变换后突出显示蓝色框的位置。

结果:

iOS7存在问题 - 当所有盒子的尺寸减半时,两个盒子A和C不会保持居中。

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

问题:

导致此问题的原因是什么?如何才能最好地纠正和解决所有iOS7 / 8/9版本的工作方式相同?

iOS7上的

CGAffineTransformMakeScale - 未按预期扩展: - (

enter image description here

iOS8 / iOS9上的

CGAffineTransformMakeScale - 按预期进行扩展: - )

enter image description here

代码:

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()
    }

}

1 个答案:

答案 0 :(得分:3)

这由Constraints & transformations - How Auto Layout quietly became transform-friendly in iOS 8描述。

基本上,在iOS7及更早版本中,您不应对转换的不同侧面的值设置约束。