【问题标题】:How to prevent manual zooming in a UIScrollView如何防止在 UIScrollView 中手动缩放
【发布时间】:2011-06-09 22:15:35
【问题描述】:

希望有人可以帮助解决这个问题。我有一个派生自 UIScrollView 的类,我想防止用户通过手动捏合和滑动手势进行缩放或滚动。相反,所有视图导航都将由编程方式控制,以响应用户点击的位置(想想电子书阅读器,点击显示屏的左侧或右侧会导致视图滚动一页宽度)。关于如何实现这一点的任何建议?

【问题讨论】:

    标签: cocoa-touch ios uiscrollview


    【解决方案1】:

    在您的 UIScrollView 子类中,还要覆盖 setZoomScale: 自动重新禁用手势的方法

    - (void)setZoomScale:(CGFloat)zoomScale {
        [super setZoomScale:zoomScale];
        self.pinchGestureRecognizer.enabled = NO;
    }
    

    【讨论】:

      【解决方案2】:

      这里有一个简短的说明。似乎UIScrollViewpanGestureRecognizerpinchGestureRecognizer 在第一次将视图控制器添加到窗口时都启用了。

      基本上这意味着将它们设置为enabled = NO in viewDidLoad 在某些情况下不起作用。我将我的enabled = NO 移动到viewWillAppear: 并卡住了。 :)

      【讨论】:

        【解决方案3】:

        在您的- (void)viewDidLoad; 上,您应该能够禁用您想要的任何手势识别器。在这种情况下:

        UIPinchGestureRecognizer *pinchRecognizer = self.pinchGestureRecognizer;
        pinchRecognizer.enabled = NO;
        

        UIPanGestureRecognizer *panRecognizer = self.scrollView.panGestureRecognizer;
        panRecognizer.enabled = NO;
        

        我有时会从包含 UIScrollViews 的视图控制器中执行此操作。我只是针对滚动视图(self.scrollView.pinchGestureRecognizer)并在应用程序时暂时禁用手势。处于某种状态。

        【讨论】:

        • UIPinchGestureRecognizer 似乎通过设置缩放比例在内部启用。 以编程方式设置它们之后禁用它。
        【解决方案4】:

        要防止用户控制器缩放和平移但仍允许以编程方式缩放和平移滚动视图,最好的方法是在子类中覆盖 UIScrollView 的 -addGestureRecognizer: 方法。 在我的使用中,我想阻止所有识别器并完全从我的视图控制器控制可视区域,我这样做了:

        -(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
            //Prevent any of the default panning and zooming controls from working
            gestureRecognizer.enabled = NO;
            [super addGestureRecognizer:gestureRecognizer];
        }
        

        每个手势识别器都被简单地禁用,为了进行更精细的控制(例如,允许平移控制但只允许通过双击进行缩放),您只需通过 -isKindOfClass: 检查传入的手势识别器并酌情禁用。

        -(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
            //Prevent zooming but not panning
            if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]]) {
                gestureRecognizer.enabled = NO;
            }
            [super addGestureRecognizer:gestureRecognizer];
        }
        

        我在一个漫画阅读应用程序中使用了这种方法,该应用程序使用引导导航在页面上的裁剪面板之间进行动画处理,整个页面包含在 UIScrollView 中。我可以通过简单地设置视图来平滑地放大和缩小选定区域限制到我要显示的区域。

        【讨论】:

        • 你怎么知道 Apple 会在这里一直使用 UIPinchGestureRecognizer?这不是实现目标的不确定方式吗?
        【解决方案5】:

        我对@9​​87654322@s 没有太多经验,但查看文档,您似乎可以设置maximumZoomScaleminimumZoomScalescrollEnabled 来禁用您想要禁用的所有内容。

        这里是文档:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html

        来自文档:

        scrollEnabled:

        如果此属性的值为 YES , 启用滚动,如果它是 NO , 滚动被禁用。默认 是的。

        当滚动被禁用时,滚动 视图不接受触摸事件;它 将它们向上转发到响应者链。

        maximumZoomScale

        这个值决定了 内容可以缩放。一定是 大于最小缩放比例 用于启用缩放。默认 值为 1.0。

        【讨论】:

        • 我最终发现最好通过子类化滚动视图并替换将手势识别器附加到视图的方法来完成。通过拦截它,您可以检查所附加的手势识别器的类并阻止捏合和平移手势识别器。对于我正在编写的代码,我想防止通常的捏和平移手势起作用,以便导航完全由编程控制。我简单地将继承的子类设置为从不附加手势识别器,然后我的代码对滚动视图的子视图接收到的触摸事件起作用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        • 2012-03-06
        • 2021-02-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多