10

我想在视图上模拟“放大”。较大的视图将作为子视图添加到较小的视图的超级视图中,并且较大的视图应该看起来像是从较小的视图放大。给定小视图的矩形fromRect和放大的大视图的最后一帧,finalRect正确的变换是什么?

在此处输入图像描述

我想方法签名将如下所示,并且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;
}
4

3 回答 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

(我仍然需要更新它以使用身份作为完整图像)

于 2013-02-08T01:27:42.887 回答
2

如果只处理图像,则可以利用 UIImageView 的 contentMode 属性并将其设置为 UIViewContentModeScaleAspectFill。然后你可以做一个 [UIView transitionWithView:] 并将你的 UIImageView 的框架设置为你的最终 CGRect (或你的整个屏幕,因为它会正确填充)。它会做你正在寻找的放大效果。

最好的方法是创建 UIImageView 的副本作为您的 superview 的子视图,并将其放在原始 UIImageView 的顶部并从那里执行转换。

我写了一些函数来将它扩展到 UITableViewController 一段时间,它可以让你放大任何 UIImageView 并带有淡入黑色和缩放过渡,最终图像是可缩放的并且可以被关闭。

https://github.com/PeterCen/iOS-Image-Presenter/

于 2013-01-30T01:34:07.033 回答
1

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

于 2013-02-08T01:18:14.383 回答