从一个矩形缩放UIView的适当转换是什么?

10

我想模拟对视图进行“放大”的效果。较大的视图将作为子视图添加到较小视图的父视图中,并且较大的视图应该看起来像是从较小的视图中放大出来。给定较小视图的矩形fromRect和放大后较大视图的最终框架finalRect,应该使用什么样的变换?

enter image description here

我想方法签名应该像下面这样,其中view是父视图。我写了这个来帮助自己,但还没有弄清楚。

-(CGAffineTransform) translatedAndScaledTransformUsingViewRect:(CGRect)viewRect fromRect:(CGRect)fromRect inView:(UIView*) view
{
//calculate the scaling based on the final frame of viewToBeStretched (viewRect) vs the "fromRect"
CGFloat scaleX = ?, scaleY = ?;
CGAffineTransform scaleTransform = CGAffineTransformMakeScale(scaleX, scaleY);

//use translation instead of modifying the view's center, since frame changes with transforms are no good
CGFloat translationX = ?, translationY =?;
CGAffineTransform translationTransform = CGAffineTransformMakeTranslation(translationX, translationY);

CGAffineTransform final = CGAffineTransformConcat(scaleTransform, translationTransform);

return final;
}

你知道,对于比例尺来说,只需要将你想要调整大小的矩形的最终长度除以当前视图的大小即可。而翻译可能会更加困难一些。 - CodaFi
@CodaFi 对,我可以只进行缩放,但不想在这里弄乱示例。我可以轻松将center属性设置为较小视图的中心,但这无法与transforms一起使用。 - akaru
1
你在这里发布的代码片段似乎是正确的,那么具体哪里出了问题呢? - MrTJ
无论如何,我建议将较大的视图添加到您的超级视图_pre-transformed_中,以便在用户单击它时完全覆盖较小的视图。然后,通过动画将转换矩阵重置为单位矩阵,因此结果将从小视图的位置弹出。 - MrTJ
3个回答

21

因此,实际的实现非常简单:

- (CGAffineTransform)translatedAndScaledTransformUsingViewRect:(CGRect)viewRect fromRect:(CGRect)fromRect {

    CGSize scales = CGSizeMake(viewRect.size.width/fromRect.size.width, viewRect.size.height/fromRect.size.height);
    CGPoint offset = CGPointMake(CGRectGetMidX(viewRect) - CGRectGetMidX(fromRect), CGRectGetMidY(viewRect) - CGRectGetMidY(fromRect));
    return CGAffineTransformMake(scales.width, 0, 0, scales.height, offset.x, offset.y);

}
你可以在这里查看完整示例:https://github.com/vGubriienko/TransformTest (我仍然需要更新它,以使用身份作为完整图像)

2
如果你只涉及到图片,可以利用UIImageView的contentMode属性,并将其设置为UIViewContentModeScaleAspectFill。然后,您只需使用[UIView transitionWithView:]并将UIImageView的框架设置为最终CGRect(或整个屏幕,因为它会正确填充),即可实现所需的缩放效果。
最好的方法是创建一个UIImageView的副本作为您的父视图的子视图,并将其放置在原始UIImageView的正上方,并从那里执行变换。
我之前写了一些函数来扩展它到UITableViewController,这样就可以对任何UIImageView进行缩放,具有淡入淡出和缩放转换效果,并且最终的图像是可缩放和可解除的。 https://github.com/PeterCen/iOS-Image-Presenter/

做得很好,但我需要使用转换来完成这个任务,因为这将是一个视图控制器的转换 - 因此vc必须在开始时更小。你的例子假设UIImageView会处理它的内容。 - akaru

1
事实证明,最好的解决方案是手动创建一个使用矩阵的变换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接