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

Spa*_*het 16 core-graphics linear-algebra ios

说,我有两个CGRects,CGRect A和CGRect B.我的UIView的框架与CGRect B相同,但我想创建一个动画,显示UIView从框架A转换到B.

我试图通过改变UIView的transform属性来做到这一点,所以我不必太乱用它的框架.但是,我需要CGAffineTransform来实现这一目标.计算此变换的最佳方法是什么?

jos*_*new 36

以前的答案对我不起作用.这应该工作:

+ (CGAffineTransform) transformFromRect:(CGRect)sourceRect toRect:(CGRect)finalRect {
    CGAffineTransform transform = CGAffineTransformIdentity;
    transform = CGAffineTransformTranslate(transform, -(CGRectGetMidX(sourceRect)-CGRectGetMidX(finalRect)), -(CGRectGetMidY(sourceRect)-CGRectGetMidY(finalRect)));
    transform = CGAffineTransformScale(transform, finalRect.size.width/sourceRect.size.width, finalRect.size.height/sourceRect.size.height);

    return transform;
}
Run Code Online (Sandbox Code Playgroud)

迅速:

func transformFromRect(from: CGRect, toRect to: CGRect) -> CGAffineTransform {
    let transform = CGAffineTransformMakeTranslation(CGRectGetMidX(to)-CGRectGetMidX(from), CGRectGetMidY(to)-CGRectGetMidY(from))
    return CGAffineTransformScale(transform, to.width/from.width, to.height/from.height)
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特4:

func transformFromRect(from source: CGRect, toRect destination: CGRect) -> CGAffineTransform {
    return CGAffineTransform.identity
        .translatedBy(x: destination.midX - source.midX, y: destination.midY - source.midY)
        .scaledBy(x: destination.width / source.width, y: destination.height / source.height)
}
Run Code Online (Sandbox Code Playgroud)

  • 我在你的评论中添加了Swift 4版本 (2认同)

Spa*_*het 8

我无法为此找到任何类型的便利方法,因此我采用了经过验证的真实矩阵计算来实现这一目标.

给定CGRect A和CGRect B,要计算从A到B所需的转换,请执行以下操作:

CGAffineTransform transform = CGAffineTransformTranslate(CGAffineTransformIdentity, -A.origin.x, -A.origin.y);
transform = CGAffineTransformScale(transform, 1/A.size.width, 1/A.size.height);
transform = CGAffineTransformScale(transform, B.size.width, B.size.height);
transform = CGAffineTransformTranslate(transform, B.origin.x, B.origin.y);
Run Code Online (Sandbox Code Playgroud)