OStack程序员社区-中国程序员成长平台

标题: iphone - 当图像放大太大时,UIPinchGestureRecognizer 表现得很有趣 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 09:38
标题: iphone - 当图像放大太大时,UIPinchGestureRecognizer 表现得很有趣

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

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

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

- (void)scaleUIPinchGestureRecognizer *)sender 
{
    if([sender state] == UIGestureRecognizerStateBegan) 
    {
        lastScale = [sender scale];
    }

    if ([sender state] == UIGestureRecognizerStateBegan || 
        [sender state] == UIGestureRecognizerStateChanged) 
    {
        CGFloat currentScale = [[[sender view].layer valueForKeyPath"transform.scale"] floatValue];
        CGFloat newScale = 1 -  (lastScale - [sender scale]);// * (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) && newScale < 1))
        {
            CGAffineTransform transform = CGAffineTransformScale([[sender view] transform], newScale, newScale);
            [[sender view] setTransform: transform];
            lastScale = [sender scale];;
        }
    } 
}



Best Answer-推荐答案


我注意到我必须检查缩放的 NaN(不是数字)结果,然后分别处理它们。使用 isnan() 进行检查。

关于iphone - 当图像放大太大时,UIPinchGestureRecognizer 表现得很有趣,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7979662/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4