希望有人可以帮助解决这个问题。我有一个派生自UIScrollView的类,我想阻止用户通过手动捏合和滑动手势进行缩放或滚动。所有视图导航将由编程方式控制,以响应用户点击的位置(想想电子书阅读器,其中点击显示器的左侧或右侧导致视图仅滚动一页宽度)。关于如何实现这个的任何建议?
答案 0 :(得分:9)
在- (void)viewDidLoad;
上,你应该可以禁用你想要的任何手势识别器。在这种情况下:
UIPinchGestureRecognizer *pinchRecognizer = self.pinchGestureRecognizer;
pinchRecognizer.enabled = NO;
或
UIPanGestureRecognizer *panRecognizer = self.scrollView.panGestureRecognizer;
panRecognizer.enabled = NO;
我有时会从包含UIScrollViews的视图控制器执行此操作。我只是定位滚动视图(self.scrollView.pinchGestureRecognizer
)并在应用时暂时禁用手势。处于某种状态。
答案 1 :(得分:7)
要防止用户控制器缩放和平移但仍允许滚动视图的编程缩放和平移,最好的方法是覆盖子类中的UIScrollView的-addGestureRecognizer:
方法。
在我的使用中,我想阻止所有识别器并完全从我的视图控制器控制可视区域,我这样做:
-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
//Prevent any of the default panning and zooming controls from working
gestureRecognizer.enabled = NO;
[super addGestureRecognizer:gestureRecognizer];
}
每个手势识别器都被禁用,以便更精细地控制(允许平移控制,但仅允许通过双击进行缩放),您只需通过-isKindOfClass:
检查传入手势识别器并在适当时禁用。 / p>
-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
//Prevent zooming but not panning
if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]]) {
gestureRecognizer.enabled = NO;
}
[super addGestureRecognizer:gestureRecognizer];
}
我在漫画阅读应用中使用此方法,该应用使用导航导航在页面上的裁剪面板之间制作动画,整个页面包含在UIScrollView中。我可以通过简单地设置视图来平滑地放大和缩小选定区域限制到我想要显示的区域。
答案 2 :(得分:4)
这里有一个快速说明。第一次将视图控制器添加到窗口时,似乎UIScrollView
的{{1}}和panGestureRecognizer
都已启用。
基本上,将pinchGestureRecognizer
中的enabled = NO
设置为viewDidLoad
在某些情况下无效。我将enabled = NO
移到viewWillAppear:
并且卡住了。 :)
答案 3 :(得分:1)
我对UIScrollView
没有太多经验,但查看文档,您可以将maximumZoomScale
,minimumZoomScale
和scrollEnabled
设置为禁用您要禁用的所有内容。
来自文档:
scrollEnabled
:
如果此属性的值为YES, 滚动已启用,如果为否 ,滚动被禁用。默认 是的。
禁用滚动时,滚动 视图不接受触摸事件;它 将他们转发到响应者链。
maximumZoomScale
:
这个值决定了它的大小 内容可以缩放。肯定是 大于最小缩放比例 用于缩放以启用。默认 值是1.0。
答案 4 :(得分:1)
在你的UIScrollView子类中也覆盖了setZoomScale:方法,该方法会自动重新禁用手势
- (void)setZoomScale:(CGFloat)zoomScale {
[super setZoomScale:zoomScale];
self.pinchGestureRecognizer.enabled = NO;
}