将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.的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法计算将视图从帧 A 转换到帧 B 所需的 CGAffineTransform?