以编程方式将触摸传递给 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 以进行滚动的主要内容,如果未能解决你的问题,请参考以下文章