相对于另一个视图的观点转换视图转换的最佳方法是什么?
示例:
视图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
方法。如何为转换创建类似的隐蔽方法?
非常感谢帮助:)
答案 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感谢您的帮助:)