1

最近、スワイプ可能にする必要があるスーパービューと、スワイプ可能にする必要があるサブビューがあるという問題に遭遇しました。相互作用は、スワイプがその境界内で発生した場合、サブビューがスワイプされる唯一のものであるべきであるというものでした。スワイプがサブビューの外で発生した場合、スーパービューがスワイプを処理する必要があります。

この正確な問題を解決する答えを見つけることができず、最終的に、他の人の助けになるなら投稿したいと思ったハッキーな解決策を思いつきました.

編集:より良い解決策が正解としてマークされるようになりました。

タイトルを「タッチ イベントを無視...」から「ジェスチャを無視...」に変更しました。

4

2 に答える 2

0

基本的な前提は、タッチが発生したときにキャッチし、一連のビュー内でタッチが発生した場合はジェスチャーを削除することです。次に、ジェスチャ認識エンジンがジェスチャを処理した後、ジェスチャを再度追加します。

@interface TouchIgnorer : UIView
@property (nonatomic) NSMutableSet * ignoreOnViews;
@property (nonatomic) NSMutableSet * gesturesToIgnore;
@end
@implementation TouchIgnorer
- (id) init
{
    self = [super init];
    if (self)
    {
        _ignoreOnViews = [[NSMutableSet alloc] init];
        _gesturesToIgnore = [[NSMutableSet alloc] init];
    }
    return self;
}
- (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    CGPoint relativePt;
    for (UIView * view in _ignoreOnViews)
    {
        relativePt = [view convertPoint:point toView:view];
        if (!view.isHidden && CGRectContainsPoint(view.frame, relativePt))
        {
            for (UIGestureRecognizer * gesture in _gesturesToIgnore)
            {
                [self removeGestureRecognizer:gesture];
            }
            [self performSelector:@selector(rebindGestures) withObject:self afterDelay:0];
            break;
        }
    }
    return [super pointInside:point withEvent:event];
}

- (void) rebindGestures
{
    for (UIGestureRecognizer * gesture in _gesturesToIgnore)
    {
        [self addGestureRecognizer:gesture];
    }
}
@end
于 2014-04-15T14:18:50.273 に答える