如何将UIView缩放(缩放)到给定的CGPoint

gle*_*rey 13 zoom objective-c cgaffinetransform ios

我花了很多时间试图找到一种方法来使用CGAffineScale将视图转换为给定点,包括弄乱锚点,在转换之前和之后移动视图的中心以及全面的Google搜索.我知道使用UIScrollview会更简单; 但是我知道技术上可以不用一个,而且它在我脑海里成了一个分裂.

这个答案非常接近我想要实现的目标,但答案只提供了如何通过巧妙地将中心移动到与要放大的角相对的角落来放大到给定角(而不是给定点)的细节. .

如何修改mvds的代码以将UIView扩展到UIView中的任何给定点?

CGFloat s = 3;
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
    self.view.transform = tr;
    self.view.center = CGPointMake(w-w*s/2,h*s/2);
} completion:^(BOOL finished) {}];
Run Code Online (Sandbox Code Playgroud)

mvd*_*vds 6

涉及两个步骤:首先,您要放大要放大的视图。然后,设置此爆炸视图的中心,以使要查看的部分最终位于视图的中间。

您应该在纸上画出来,公式如下:(未经测试)

CGFloat s = 3;
CGPoint p = CGPointMake(100, 200);
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
    self.view.transform = tr;
    CGFloat cx = w/2-s*(p.x-w/2);
    CGFloat cy = h/2-s*(p.y-h/2);
    self.view.center = CGPointMake(cx, cy); //was: (w*s/2,h-h*s/2);
} completion:^(BOOL finished) {}];
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢您的回答。我确实尝试过,但是它仍然会放大到错误的位置。我也尝试过将其绘制在纸上,但逻辑使我难以理解。 (2认同)