当前位置:  开发笔记 > 编程语言 > 正文

使用UIScrollView用两根手指滚动

如何解决《使用UIScrollView用两根手指滚动》经验,为你挑选了5个好方法。

我在我的主视图,可同时接收应用程序touchesBegantouchesMoved,因此,需要在单手指触摸,并拖动.我想实现一个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会忽略一个手指拖动,因此单指拖动事件将传递到内容视图.



1> 小智..:

在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; 似乎它被设置为一个.到目前为止,这是获得双指滚动工作的最简单方法.

2> Guto Araujo..:

对于iOS 5+,设置此属性与Mike Laurence的答案效果相同:

self.scrollView.panGestureRecognizer.minimumNumberOfTouches = 2;

panGestureRecognizer会忽略一个手指拖动,因此单指拖动事件将传递到内容视图.


这应该是当前接受的答案。

3> Mike Laurenc..:

在iOS 3.2+中,您现在可以轻松实现双指滚动.只需在滚动视图中添加一个平移手势识别器,并将其maximumNumberOfTouches设置为1.它将声明所有单指滚动,但允许2个手指滚动将链向上传递到滚动视图的内置平移手势识别器(从而允许正常的滚动行为).

UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(recognizePan:)];
panGestureRecognizer.maximumNumberOfTouches = 1;
[scrollView addGestureRecognizer:panGestureRecognizer];
[panGestureRecognizer release];



4> Andrey Taran..:

你需要子类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类; 它对用户来说并不好,但对程序员来说确实感觉很好.



5> Dan Rosensta..:

这个答案很乱,因为你只能通过阅读所有其他答案和评论找到正确的答案(最接近的答案得到了倒退的问题).接受的答案太模糊而无用,并提出了一种不同的方法.

合成,这是有效的

    // 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也可以进行缩放,那么这可能会变得非常混乱...手势无法正常工作,因为捏缩放和滚动对抗它.如果我找到合适的答案,我会更新.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有