我在我的主视图,可同时接收应用程序touchesBegan
和touchesMoved
,因此,需要在单手指触摸,并拖动.我想实现一个UIScrollView
,我有它的工作,但它覆盖了拖动,因此我的contentView永远不会收到它们.我想实现一个UIScrollview
,其中双指拖动指示滚动,并且单指拖动事件被传递到我的内容视图,因此它正常执行.我需要创建自己的子类UIScrollView
吗?
这是我appDelegate
实现的代码UIScrollView
.
@implementation MusicGridAppDelegate @synthesize window; @synthesize viewController; @synthesize scrollView; - (void)applicationDidFinishLaunching:(UIApplication *)application { // Override point for customization after app launch //[application setStatusBarHidden:YES animated:NO]; //[window addSubview:viewController.view]; scrollView.contentSize = CGSizeMake(720, 480); scrollView.showsHorizontalScrollIndicator = YES; scrollView.showsVerticalScrollIndicator = YES; scrollView.delegate = self; [scrollView addSubview:viewController.view]; [window makeKeyAndVisible]; } - (void)dealloc { [viewController release]; [scrollView release]; [window release]; [super dealloc]; }
小智.. 64
在SDK 3.2中,UIScrollView的触摸处理使用Gesture Recognizers处理.
如果要进行双指平移而不是默认的单指平移,可以使用以下代码:
for (UIGestureRecognizer *gestureRecognizer in scrollView.gestureRecognizers) { if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { UIPanGestureRecognizer *panGR = (UIPanGestureRecognizer *) gestureRecognizer; panGR.minimumNumberOfTouches = 2; } }
我通过设置得到了这个解决方案:panGR.maximumNumberOfTouches = 2; 似乎它被设置为一个.到目前为止,这是获得双指滚动工作的最简单方法. (15认同)
Guto Araujo.. 37
对于iOS 5+,设置此属性与Mike Laurence的答案效果相同:
self.scrollView.panGestureRecognizer.minimumNumberOfTouches = 2;
panGestureRecognizer会忽略一个手指拖动,因此单指拖动事件将传递到内容视图.
在SDK 3.2中,UIScrollView的触摸处理使用Gesture Recognizers处理.
如果要进行双指平移而不是默认的单指平移,可以使用以下代码:
for (UIGestureRecognizer *gestureRecognizer in scrollView.gestureRecognizers) { if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { UIPanGestureRecognizer *panGR = (UIPanGestureRecognizer *) gestureRecognizer; panGR.minimumNumberOfTouches = 2; } }
对于iOS 5+,设置此属性与Mike Laurence的答案效果相同:
self.scrollView.panGestureRecognizer.minimumNumberOfTouches = 2;
panGestureRecognizer会忽略一个手指拖动,因此单指拖动事件将传递到内容视图.
在iOS 3.2+中,您现在可以轻松实现双指滚动.只需在滚动视图中添加一个平移手势识别器,并将其maximumNumberOfTouches设置为1.它将声明所有单指滚动,但允许2个手指滚动将链向上传递到滚动视图的内置平移手势识别器(从而允许正常的滚动行为).
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(recognizePan:)]; panGestureRecognizer.maximumNumberOfTouches = 1; [scrollView addGestureRecognizer:panGestureRecognizer]; [panGestureRecognizer release];
你需要子类UIScrollView(当然!).然后你需要:
使单指事件转到您的内容视图(简单),和
使双指事件滚动滚动视图(可能很容易,可能很难,可能是不可能的).
Patrick的建议通常很好:让你的UIScrollView子类知道你的内容视图,然后在触摸事件处理程序中检查手指的数量并相应地转发事件.只需确保(1)您发送到内容视图的事件不会通过响应器链回送到UIScrollView(即确保全部处理它们),(2)尊重触摸事件的常规流程(即touchesBegan,而不是一些{touchesBegan,touchesMoved,touchesEnded},用touchesEnded或touchesCancelled完成,特别是在处理UIScrollView时.#2可能很棘手.
如果您确定该事件是针对UIScrollView,另一个技巧是让UIScrollView相信您的双指手势实际上是单指手势(因为UIScrollView无法用两根手指滚动).尝试只将一个手指的数据传递给super(通过过滤(NSSet *)touches
参数 - 请注意它只包含已更改的触摸 - 并完全忽略错误手指的事件).
如果这不起作用,你就麻烦了.从理论上讲,您可以尝试通过创建类似于UITouch的类来创建人工触摸以提供给UIScrollView.基础C代码不检查类型,因此可能会将(YourTouch*)转换为(UITouch*),并且您将能够欺骗UIScrollView来处理实际没有发生的触摸.
您可能想阅读有关高级UIScrollView技巧的文章(并在那里查看一些完全不相关的UIScrollView示例代码).
当然,如果你不能让它工作,总是可以选择手动控制UIScrollView的移动,或使用完全自定义编写的滚动视图.Three20库中有TTScrollView类; 它对用户来说并不好,但对程序员来说确实感觉很好.
这个答案很乱,因为你只能通过阅读所有其他答案和评论找到正确的答案(最接近的答案得到了倒退的问题).接受的答案太模糊而无用,并提出了一种不同的方法.
合成,这是有效的
// makes it so that only two finger scrolls go for (id gestureRecognizer in self.gestureRecognizers) { if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { UIPanGestureRecognizer *panGR = gestureRecognizer; panGR.minimumNumberOfTouches = 2; panGR.maximumNumberOfTouches = 2; } }
这需要两个手指进行滚动.我已经在子类中完成了这个,但如果没有,只需替换self.gestureRecognizers
,myScrollView.gestureRecognizers
你就可以了.
我添加的唯一一件事是使用id
避免丑陋的演员:)
如果您希望UIScrollView也可以进行缩放,那么这可能会变得非常混乱...手势无法正常工作,因为捏缩放和滚动对抗它.如果我找到合适的答案,我会更新.