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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将UIView转换从视图A转换为视图B.相关的知识,希望对你有一定的参考价值。

将视图转换相对于另一个视图转换为视角的最佳方法是什么?


例:

查看A有2个孩子,查看B和C.查看B还有一个孩子,查看D.

View Hierarchy
      A
     / 
    B   C
   /
  D

B上的变换不是identity而D是"identity",但只有当D被观察到孤立时(不考虑B上的变换)。

视图C必须知道视图D的变换是相对的。在C视角D不是identity


我一直在考虑UICoordinateSpace和它的convert方法。如何为变换创建类似的隐蔽方法?

非常感谢帮助:)

答案

@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谢谢你的帮助:)

以上是关于将UIView转换从视图A转换为视图B.的主要内容,如果未能解决你的问题,请参考以下文章

IOS-- UIView中的坐标转换

为啥不能将“UIView”类型的值转换为其他视图?

将 UIView 坐标从纵向转换为横向,反之亦然

有没有办法计算将视图从帧 A 转换到帧 B 所需的 CGAffineTransform?

如何将 UITableViewCell 的内容视图转换为 Interface Builder 中的普通 UIView?

iOS UIView中的坐标转换