2

ユーザーが画面を下にスクロールすると、ボタンが画面の上部に固定されるように、テーブルビューのセクションヘッダーにボタンを持つ UITableView を構築しています。

問題は、UITableView が移動しているときに、セクション ヘッダーのボタンのタッチ イベントが登録されないことです。テーブルビューがスクロールしていない場合、ボタンはタッチイベントのみを取得します。

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    if (!_sectionHeaderView) {
        _sectionHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200)];

        UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
        backButton.frame = CGRectMake(0, 0, 50, 50);
        [backButton setImage:[UIImage imageNamed:@"upArrow"] forState:UIControlStateNormal];
        [backButton addTarget:self action:@selector(scrollToTop:) forControlEvents:UIControlEventTouchUpInside];
        [_sectionHeaderView addSubview:backButton];

    }
    return _sectionHeaderView;
}

現在、何が起こるか: - テーブルビューがスクロールしていない場合、ボタンは期待どおりに動作します: タップすると、ボタンは TouchUpInside ジェスチャを取得します。- テーブルビューがスクロールしている場合、ボタンは TouchUpInside ジェスチャを取得しません。代わりに、テーブルビューはその場で停止します。

UITableView をサブクラス化し、touchesBegan: メソッドなどを調べてみましたが、うまくいきませんでした。同じパターンが見られます。ジェスチャは、テーブルビューが動いていない場合にのみ表示されます。

更新: これはユーザビリティの問題ではありません。作業中のデザインのスクリーンショットを表示することはできませんが、セクション ヘッダーでボタンとコントロールを使用することは有効なユース ケースです。

理由を説明する簡単なスケッチを次に示します。

フローティング セクション ヘッダー

4

2 に答える 2

6

理解した!あなたがする必要があるのは、サブクラスUITableViewとオーバーライドだけですhitTest:withEvent:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if ([[super hitTest:point withEvent:event] isKindOfClass:[UIButton class]]) {
        UIButton *buttonThatWasTapped = (UIButton *)[super hitTest:point withEvent:event];
        [buttonThatWasTapped sendActionsForControlEvents:UIControlEventTouchUpInside];
    }
        return [super hitTest:point withEvent:event];
}

このコードの動作は次のとおりです。テーブルビューがタッチされ、タッチが UIButton の境界内で発生した場合、テーブルビューはタッチ イベントを UIButton に転送します。

ここで注意点があります。タッチ イベントが UIButton に数回送信される可能性があります (タッチごとに 3 回呼び出しが行われていることがわかります)。このコードは私のニーズには十分でしたが、アプリでこのコードを使用している場合は、その問題に注意してください。これを考慮して上記のコードを変更する必要がある場合があります。

于 2013-05-21T20:00:41.920 に答える
2

これが起こるはずのことです。

ユーザーはこの動作に慣れています。これにより、タッチしたいものが表示されたときに、テーブル ビューのスクロールを停止できます。

「ユニコーン」行を探してテーブルをスクロールしていて、非常に速くスクロールしていたと想像してください(テーブルが大きく、ユニコーンがどこにあるのかわからないため)。「ユニコーン」が視界を横切ると、本能的にテーブルを止めて選択します。

現在のシステムでは、テーブル ビューの任意の場所をタップすると停止します。テーブル ビューがあなたのやり方で実装されていたら、「地下ロックチャック」をタップしてテーブルを停止すると、突然ロックチャックに関する情報が表示され、ユニコーンに関する情報が必要になります。

私は不満を持ったユーザーになり、あなたのアプリを Apple に返却し、0.99 ドルを取り戻します。

ユーザーにそれをさせたくありません。

于 2013-05-21T00:07:15.167 に答える