菜鸟教程小白 发表于 2022-12-13 09:38:34

iphone - 当图像放大太大时,UIPinchGestureRecognizer 表现得很有趣


                                            <p><p>我有一个简单的应用程序,我在其中将 UIPinchGestureRecognizer 和 UIPanGestureRecognizer 附加到 imageView,以便我可以拖动和缩放它。我已经做到了,因此可以将 imageView 部分移出屏幕并最小化显示,但图像的一小部分 75 像素仍保留在显示屏上,因此可以将图像拖回其上。因此,例如,如果我尝试将 imageView 拖离显示器的右侧,它将在剩余 75 个像素的 imageView 时停止,留出足够的空间让我将其拖回。与缩放相同的概念,我创建的边界框架防止 imageView 被最小化显示。 </p>

<p>无论如何,我的 UIPinchGestureRecognizer 委托(delegate)方法中的边界代码存在这个问题。我做边界的方式是我正在创建一个框架,它是 imageViewssuperView 的副本 - 除了它在每侧以及顶部和底部被插入 75 像素。我检查 imageView 是否与此框架不相交,然后我知道它已到达右/左或上/下的边界之一。它在大多数情况下都有效,但是当我将图像放大到相当大时(通常超过 1000 x 1000),边界不起作用 - 如果我进行超快速最小化比例,则 imageView 会被完全推离屏幕所以我不能把它拖回来。</p>

<p>我只是想知道为什么会这样。它与图像尺寸太大有关吗?还是我的代码有缺陷? (我在下面列出)。如果有人可以提供帮助,将不胜感激。</p>

<pre><code>- (void)scale:(UIPinchGestureRecognizer *)sender
{
    if( == UIGestureRecognizerStateBegan)
    {
      lastScale = ;
    }

    if ( == UIGestureRecognizerStateBegan ||
       == UIGestureRecognizerStateChanged)
    {
      CGFloat currentScale = [[.layer valueForKeyPath:@&#34;transform.scale&#34;] floatValue];
      CGFloat newScale = 1 -(lastScale - );// * (CropThePhotoViewControllerPinchSpeed);   
      newScale = MAX(newScale, CropThePhotoViewControllerMinScale / currentScale);

      CGFloat scaledWidth = newScale * sender.view.frame.size.width;
      CGFloat scaledHeight = newScale * sender.view.frame.size.height;

      CGRect translatedRect = CGRectMake(sender.view.frame.origin.x, sender.view.frame.origin.y, scaledWidth, scaledHeight);
      CGRect boundaryRect = CGRectMake(sender.view.superview.frame.origin.x + CropThePhotoViewControllerBoundaryBuffer, sender.view.superview.frame.origin.y + CropThePhotoViewControllerBoundaryBuffer, sender.view.superview.frame.size.width - (CropThePhotoViewControllerBoundaryBuffer * 2), sender.view.superview.frame.size.height - (CropThePhotoViewControllerBoundaryBuffer * 2));

      if (!(!CGRectIntersectsRect(boundaryRect,translatedRect) &amp;&amp; newScale &lt; 1))
      {
            CGAffineTransform transform = CGAffineTransformScale([ transform], newScale, newScale);
            [ setTransform: transform];
            lastScale = ;;
      }
    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我注意到我必须检查缩放的 NaN(不是数字)结果,然后分别处理它们。使用 isnan() 进行检查。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - 当图像放大太大时,UIPinchGestureRecognizer 表现得很有趣,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/7979662/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/7979662/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - 当图像放大太大时,UIPinchGestureRecognizer 表现得很有趣