【发布时间】:2011-06-09 22:15:35
【问题描述】:
希望有人可以帮助解决这个问题。我有一个派生自 UIScrollView 的类,我想防止用户通过手动捏合和滑动手势进行缩放或滚动。相反,所有视图导航都将由编程方式控制,以响应用户点击的位置(想想电子书阅读器,点击显示屏的左侧或右侧会导致视图滚动一页宽度)。关于如何实现这一点的任何建议?
【问题讨论】:
标签: cocoa-touch ios uiscrollview
希望有人可以帮助解决这个问题。我有一个派生自 UIScrollView 的类,我想防止用户通过手动捏合和滑动手势进行缩放或滚动。相反,所有视图导航都将由编程方式控制,以响应用户点击的位置(想想电子书阅读器,点击显示屏的左侧或右侧会导致视图滚动一页宽度)。关于如何实现这一点的任何建议?
【问题讨论】:
标签: cocoa-touch ios uiscrollview
在您的 UIScrollView 子类中,还要覆盖 setZoomScale: 自动重新禁用手势的方法
- (void)setZoomScale:(CGFloat)zoomScale {
[super setZoomScale:zoomScale];
self.pinchGestureRecognizer.enabled = NO;
}
【讨论】:
这里有一个简短的说明。似乎UIScrollView 的panGestureRecognizer 和pinchGestureRecognizer 在第一次将视图控制器添加到窗口时都启用了。
基本上这意味着将它们设置为enabled = NO in viewDidLoad 在某些情况下不起作用。我将我的enabled = NO 移动到viewWillAppear: 并卡住了。 :)
【讨论】:
在您的- (void)viewDidLoad; 上,您应该能够禁用您想要的任何手势识别器。在这种情况下:
UIPinchGestureRecognizer *pinchRecognizer = self.pinchGestureRecognizer;
pinchRecognizer.enabled = NO;
或
UIPanGestureRecognizer *panRecognizer = self.scrollView.panGestureRecognizer;
panRecognizer.enabled = NO;
我有时会从包含 UIScrollViews 的视图控制器中执行此操作。我只是针对滚动视图(self.scrollView.pinchGestureRecognizer)并在应用程序时暂时禁用手势。处于某种状态。
【讨论】:
UIPinchGestureRecognizer 似乎通过设置缩放比例在内部启用。 在以编程方式设置它们之后禁用它。
要防止用户控制器缩放和平移但仍允许以编程方式缩放和平移滚动视图,最好的方法是在子类中覆盖 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 中。我可以通过简单地设置视图来平滑地放大和缩小选定区域限制到我要显示的区域。
【讨论】:
我对@987654322@s 没有太多经验,但查看文档,您似乎可以设置maximumZoomScale、minimumZoomScale 和scrollEnabled 来禁用您想要禁用的所有内容。
来自文档:
scrollEnabled:
如果此属性的值为 YES , 启用滚动,如果它是 NO , 滚动被禁用。默认 是的。
当滚动被禁用时,滚动 视图不接受触摸事件;它 将它们向上转发到响应者链。
maximumZoomScale:
这个值决定了 内容可以缩放。一定是 大于最小缩放比例 用于启用缩放。默认 值为 1.0。
【讨论】: