将UIView转换从视图A转换为视图B.

时间:2017-12-27 19:54:53

标签: ios swift uiview transform

相对于另一个视图的观点转换视图转换的最佳方法是什么?

示例:

视图A有2个孩子,视图B和C.视图B也有一个孩子,视图D.

long long x = (1 << 60)ll;
long long x = (1 << 60ll);

B上的变换不是View Hierarchy A / \ B C / D 而D是identity,但只有在看到D被隔离时(不考虑B上的变换)。

视图C必须知道视图D的变换是相对的。在C透视图中,D不是"identity"

我一直在考虑identity及其UICoordinateSpace方法。如何为转换创建类似的隐蔽方法?

非常感谢帮助:)

1 个答案:

答案 0 :(得分:0)

@Brandon建议我使用UICoordinateSpace convert方法将视图的帧转换为其他视图的CoordinateSpace,然后从帧差异中获取变换。该解决方案对我有用,但请注意,这不会考虑rotationAngle,而是会缩放变换以适应旋转的帧,因为它不会旋转。

解决方案

extension UIView {

    /// Returns transform for translation and scale difference from self and given view.
    func convertScaleAndTranslation(to view: UIView) -> CGAffineTransform {
        return CGAffineTransform.from(frame, to: convert(frame, to: view))
    }
}

extension CGAffineTransform {

    /// Returns transform for translation and scale difference from two given rects.
    static func from(_ from: CGRect, to: CGRect) -> CGAffineTransform {
        let sx  = to.size.width / from.size.width
        let sy  = to.size.height / from.size.height

        let scale = CGAffineTransform(scaleX: sx, y: sy)

        let heightDiff = from.size.height - to.size.height
        let widthDiff = from.size.width - to.size.width

        let dx = to.origin.x - widthDiff / 2 - from.origin.x
        let dy = to.origin.y - heightDiff / 2 - from.origin.y
        let trans = CGAffineTransform(translationX: dx, y: dy)

        return scale.concatenating(trans)
    }
}

@Brandon感谢您的帮助:)