【问题标题】:Changing UIView's transform doesn't affect constraints改变 UIView 的变换不会影响约束
【发布时间】:2018-02-12 13:29:59
【问题描述】:

在 iOS 11 中,更改 UIView 的转换属性(例如缩放)不会影响绑定到此视图的约束。在 iOS 10 中,一切都按预期工作。

我的代码:

import UIKit

class TestViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white

        // top view
        let topView = UIView()
        topView.frame = CGRect(x: 100, y: 100, width: 200, height: 100)
        topView.backgroundColor = .black
        view.addSubview(topView)

        topView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)

        // bottom view
        let bottomView = UIView()
        bottomView.translatesAutoresizingMaskIntoConstraints = false
        bottomView.backgroundColor = .black
        view.addSubview(bottomView)

        NSLayoutConstraint.activate([
            bottomView.heightAnchor.constraint(equalToConstant: 200),
            bottomView.widthAnchor.constraint(equalToConstant: 200),
            bottomView.leftAnchor.constraint(equalTo: topView.leftAnchor),
            bottomView.topAnchor.constraint(equalTo: topView.bottomAnchor, constant: 8)
        ])
    }
}

期待什么(iOS 10):

我有什么拥有(iOS 11):

如您所见,topView 已缩放,但 bottomView 布局不正确。我该如何解决?

【问题讨论】:

    标签: ios swift autolayout ios11


    【解决方案1】:

    来自 Apple 的 UIView / Transform Docs (https://developer.apple.com/documentation/uikit/uiview/1622459-transform):

    警告

    当此属性的值不是恒等变换时,frame 属性中的值是未定义的,并且 应该忽略。

    因此,您在 iOS 10 中获得的结果恰好是您获得的结果,而不是 正确的结果。

    【讨论】:

    • 那么有没有办法解决这个问题呢?应用转换并保持约束更新?
    【解决方案2】:

    底部视图发生的情况是,在您告诉它缩放到 %50 并添加 8 个像素之前,它与顶部视图的左锚对齐。我会硬编码左约束。查看 This Tutorial 获取有关如何使用可视格式语言执行此操作的指南。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-26
      • 2014-08-16
      • 2014-09-23
      • 2015-06-14
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      相关资源
      最近更新 更多