9

我在 UIScrollView 中有一个 UIControl。在我的 UIControl 中init,我安装了一些触摸事件处理程序,例如

[self addTarget:_delegate
         action:@selector(touchedDown) forControlEvents:UIControlEventTouchDown];

当我执行以下操作时,iOS6 和 iOS7 的行为不同:

  1. 滑动 UIScrollView 开始滚动
  2. 点击 UIScrollView 停止滚动

在 iOS6 中,我的应用程序继续按预期运行:第 2 步的点击不会调用 touchedDown—— UIScrollView 在立即停止滚动时会吞下触摸事件。

但是在 iOS7 中, UIScrollView 会按预期停止滚动,而touchedDown 仍然调用.

是否有记录在案的 API 更改?我希望我的应用程序的行为与 iOS7 中的 iOS6 相同。

4

4 回答 4

9

iOS 7 的解决方法

@interface UIScrollViewFixed : UIScrollView

@end

@implementation UIScrollViewFixed

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if (self.isDragging || self.isDecelerating) {
        return self;
    }
    return [super hitTest:point withEvent:event];
}

@end
于 2013-11-01T14:17:11.777 回答
4

只需替换事件类型

UIControlEventTouchDown一定是UIControlEventTouchUpInside

于 2013-10-15T03:05:34.683 回答
3

不是很优雅,但是在没有更好的想法的情况下,这就是现在对我有用的东西:

  • 在 UIScrollView 上,设置canCancelContentTouchesYES和。delaysContentTouchesNO
  • 在 UIScrollViewDelegate 中,userInteractionEnabled当 UIScrollView 滚动时切换 UIScrollView 的子视图的属性:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [_contentView setUserInteractionEnabled:NO];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (!decelerate) {
        [_contentView setUserInteractionEnabled:YES];
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [_contentView setUserInteractionEnabled:YES];
}
  • 子类化 UIScrollView 并实现:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
    return YES;
}
  • 子类化 UIControl 并实现touchesCancelled:withEvent以反转UIControlEventTouchDown处理程序所做的任何事情:
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    //custom logic
}
于 2013-10-02T08:52:09.793 回答
0

与 UIScrollView 上的 UIButtons 相同。这是我现在的解决方案。

而不是使用内容 UIControlEventTouchDown 事件:

[button addTarget:_delegate
         action:@selector(touchedDown) forControlEvents:UIControlEventTouchDown];

我在内容 UIViewController 中实现了 UIResponder touchesEnded 方法:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// my scroll content touch logic
}

如果用户触摸内容并开始拖动,则不会调用 touchesEnded 处理程序。UIResponder touchesCanceled 方法将。

如果用户不拖动 UIscrollview,则触发 touchesEnded 处理程序,该处理程序可用于触摸逻辑。

于 2013-10-03T08:46:37.070 回答