以编程方式将触摸传递给 UIScrollView 以进行滚动

Posted

技术标签:

【中文标题】以编程方式将触摸传递给 UIScrollView 以进行滚动【英文标题】:Programmatically pass touches to UIScrollView to scroll 【发布时间】:2010-03-10 18:57:46 【问题描述】:

基本上我试图让 UIScrollView 只在更高的角度滚动。就像现在一样,如果您将手指从水平方向移动 10 度,则滚动视图将滚动。我想把它推到 30 度。

在做了一些阅读之后,我确定了最好的方法是在滚动视图之上放置一个子类 UIView。如果顶部的 UIView 的触摸超过 30 度,则将其向下传递给滚动视图,否则不要。

但是,我不知道如何传球。这是我现在的代码:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    NSLog(@"glass touch began");
    UITouch *touch = [touches anyObject];
    beginning_touch_point = [touch locationInView:nil];
    [scroll_view touchesBegan:touches withEvent:event];


- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
    NSLog(@"glass touch ended");
    UITouch *touch = [touches anyObject];
    CGPoint previous_point = beginning_touch_point;
    CGPoint current_point = [touch locationInView:nil];

    float x_change = fabs(previous_point.x - current_point.x);
    float y_change = fabs(previous_point.y - current_point.y);

    if(x_change > y_change)
    
        if(previous_point.x - current_point.x < 0)
        
            [(MyScheduleViewController *)schedule_controller didFlickLeft];
        
        else
        
            [(MyScheduleViewController *)schedule_controller didFlickRight];
        

        [scroll_view touchesCancelled:touches withEvent:event];
    
    else 
    
        [scroll_view touchesEnded:touches withEvent:event];
    

我现在知道它正在检查 45 度,但这不是重要的事情。重要的是触摸确实正确地传递给了我的scroll_view。我让它在 touchesbegan 和 touchesended 上执行 NSLog() ,并且两者都正确执行。它只是不滚动。我担心 touchesBegan 和 touchesEnded 不会导致滚动。有谁知道什么可以,或者我做错了什么?

【问题讨论】:

你有没有设法让它工作?我目前遇到了类似的问题。 【参考方案1】:

我也尝试过这样做,但没有成功。似乎 scrollView 不处理 touchesMoved/touchesBegan,但它处理一些其他事件以了解用户想要滚动视图。 对我来说,解决方案是确定移位值并将其显式设置为滚动视图内容偏移量。它看起来像这样(我没有确切的源代码,此代码可能无法正常工作):

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    UITouch *touch = [touches anyObject];

    CGPoint curr = [touch locationInView: self];
    CGPoint offset = [scrollView contentOffset];

    [scrollView setContentOffset: CGPointMake(offset.x + (curr.x - prev.x), offset.y) animated:YES];


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    prev = [[touches anyObject] previousLocationInView: self];

【讨论】:

以上是关于以编程方式将触摸传递给 UIScrollView 以进行滚动的主要内容,如果未能解决你的问题,请参考以下文章

将触摸信息传递给另一个 UIView 下的 UIScrollView

无法触摸 UIScrollView 中的 UIButton

UIScrollView 忽略/传递 3 次触摸

如何将触摸事件从一个视图传递到另一个视图

从另一个视图将滚动手势传递给 UIScrollView

如何将触摸事件从 ScrollView 子视图传递到它的父视图