5

UIButtonUITableViewCellに入れるのUITableViewは後ろUIScrollViewです。UIScrollViewにタッチを転送するようにサブクラス化しましたUITableView

したがって、メソッド fromUITableViewDelegate didSelectRowは適切に呼び出しています。問題は、表のセル内でアクションUIButtonが受信されないことです。TouchUpInside

ScrollViewを削除せずにこの問題を解決するにはどうすればよいTableViewですか?

編集:

どのビューがタッチを受け取るかを検出することで、この問題を解決しました。コードは次のとおりです。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UIView *hitView = [self hitTest:[(UITouch*)[[touches allObjects] objectAtIndex:0] locationInView:self] withEvent:event];
    if ([hitView isKindOfClass:[UIButton class]]) {
        [(UIButton*)hitView sendActionsForControlEvents:UIControlEventTouchUpInside];
    }
    [super touchesBegan:touches withEvent:event];
}
4

2 に答える 2

4

UIScrollView と UIButton の両方のオブジェクトのアクションを有効にする場合は、ScrollView のカスタム ヒット テスト メカニズムを実装する必要があります。

UIScrollView サブクラス オーバーライド - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event メソッドで、ScrollView の背後にあるビューをイベントの取得に使用できるようにします。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    return __touchesEnabled;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    _touchesEnabled = NO;
    UIWindow *window = [UIApplication sharedApplication].delegate.window;
    for(UITouch *touch in touches) {
       CGPoint point = [touch locationInView:self];
       point = [window convertPoint:point fromView:self];
       UIView *view = [window hitTest:point withEvent:event];
       [view touchesBegan:touches withEvent:event];
    }  
    _touchesEnabled = YES;
}

わたしにはできる

于 2012-12-03T08:00:19.290 に答える
0

UIButton にスクロール ビューを追加したため、すべてのタッチ アクションはボタンに渡されません。

    [yourScrollView setUserInteractionEnabled:NO];

これで問題が解決する場合があります。

于 2012-10-09T15:07:01.500 に答える