【问题标题】:Proper transform for scaling a UIView from a rect?从矩形缩放 UIView 的正确转换?
【发布时间】:2013-01-29 23:51:03
【问题描述】:

我想在视图上模拟“放大”。较大的视图将作为子视图添加到较小的视图的父视图中,并且较大的视图应该看起来像是从较小的视图放大。给定小视图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;
}

【问题讨论】:

  • 您知道,对于比例尺,只需将您希望调整大小的矩形的最终长度除以视图的当前大小即可。翻译有点难。
  • @CodaFi 对,我可以只进行缩放,但不想污染这里的示例。我可以轻松地将 center 属性设置为较小视图的中心,但这不适用于变换。
  • 您在此处发布的那段代码似乎是正确的,那么究竟是什么不起作用?
  • 无论如何,我建议将较大的视图添加到您的超级视图 pre-transformed 中,这样一旦用户点击它,它就会完全覆盖较小的视图。然后你用动画将变换矩阵重置为单位矩阵,这样它就会从小视图的位置弹出。

标签: ios objective-c cgaffinetransform cgrect rect


【解决方案1】:

所以实际实现很简单:

- (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 的副本作为您的 superview 的子视图,并将其放在原始 UIImageView 的顶部并从那里执行转换。

    不久前,我编写了一些函数将其扩展到 UITableViewController,它可以让您放大任何带有淡入黑色和缩放过渡的 UIImageView,最终图像是可缩放的并且可以关闭。

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

    【讨论】:

    • 做得很好,但我需要使用转换来做到这一点,因为这将是一个视图控制器转换——因此一开始 vc 必须更小。您的示例假定 UIImageView 将处理其内容。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 2017-10-14
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      相关资源
      最近更新 更多