1

UIScrollViewからそのスーパービューにタッチを転送する方法を理解しようとしています。その理由は、ある種のカーソルがタッチに追従するためです。とにかく、スクロールビューにはUIButtonが表示されます。タッチを転送するための私のコードは、scrollviewサブクラスで委任を使用することです。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesBegan:touches withEvent:event];
    if ([[self tfDelegate]respondsToSelector:@selector(tfDelegateBegan:)]) {
        [[self tfDelegate]tfDelegateBegan:[touches anyObject]];
    }
        NSLog(@"touches began");
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesMoved:touches withEvent:event];
    if ([[self tfDelegate]respondsToSelector:@selector(tfDelegateMoved:)]) {
        [[self tfDelegate]tfDelegateMoved:[touches anyObject]];
    }
        NSLog(@"touches moved");
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesEnded:touches withEvent:event];
    if ([[self tfDelegate]respondsToSelector:@selector(tfDelegateEnded:)]) {
        [[self tfDelegate]tfDelegateEnded:[touches anyObject]];
    }
        NSLog(@"touches ended");
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesCancelled:touches withEvent:event];
    if ([[self tfDelegate]respondsToSelector:@selector(tfDelegateCancelled:)]) {
        [[self tfDelegate]tfDelegateCancelled:[touches anyObject]];
    }
        NSLog(@"touches cancelled");
}

ただし、UIScrollviewsはUIGestureRecognizersを介して動作することを学びました。そのため、これらのメソッドはデフォルトでは呼び出されません。ジェスチャレコグナイザーはiOS5で公開されていることを認識していますが、4.0もサポートする必要があります。私は代わりにこれをしました:

       NSArray *a = [[theScrollview gestureRecognizers]retain];
        for (UIGestureRecognizer *rec in a) {
            if ([rec isKindOfClass:[UIPanGestureRecognizer class]]) {
                NSLog(@"this is the pan gesture");
                rec.cancelsTouchesInView = NO;
            }
        }

これにより、ジェスチャが機能し、touchsメソッドを同時に呼び出すことができます。問題は、ボタンに触れながらスクロールしようとすると、スクロール中にボタンが押される可能性があることです。通常、スクロールはボタンをキャンセルし、ボタンを押すことができるのは、scrollviewがスクロールしていない場合のみです。これが望ましい機能です。これをどのように達成するかについての提案はありますか?

4

1 に答える 1

1

スクロールビューがスクロールしている場合にイベントが発生しないようにするフラグを使用して、ボタンのアクションを制御してみてください。

BOOL isScrolling = NO;

- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    isScrolling = YES;
}

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    isScrolling = NO;
}

- (void) didTapButton {

    if(isScrolling)
        return;

    //Do Button Stuff
}
于 2012-09-11T17:57:34.767 に答える