0

私はチャット アプリケーションを作成しています。チャット ウィンドウの uitableviewcells に uilabels があります。最初はキーボードが表示されますが、ユーザーがuitableviewの任意の場所に触れると、チャットウィンドウがフルスクリーンになります(キーボードが消えます)。

これを達成する方法/トリックが見つかりません。

私は次の方法を試しました: tableview:didselectrowatindexpath を使用して、私はそれを行うことができますが、ユーザーは既存の uitableviewcell を押す必要があります。しかし、uitableviewが空の場合でもプレスを理解したい..

注:私のチャットテーブルビューはインタラクティブです。一部の行には、押すことができる必要がある画像ボタンが含まれているため、目に見えないボタンをuitableviewに配置することはできません。

あなたの考えをありがとう

アイトゥンク・イセブン

4

2 に答える 2

1

実行したいのは、適切なジェスチャに応答するジェスチャレコグナイザをUITableViewに追加することです。UITableViewはすでにセルの選択にタップを使用しているため、UITapGestureRecognizerを使用しないことをお勧めします。そのため、UILongPressGestureRecognizerを試してみることをお勧めします。これを行う方法の小さなサンプルを次のようにまとめました。

私のviewDidLoadで、私は次のことを行いました。

UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressFrom:)];
[self.tableView addGestureRecognizer:gesture];

handleLongPressFrom:は次のとおりです。

- (void)handleLongPressFrom:(UILongPressGestureRecognizer *)recognizer {
    NSLog(@"handleLongPressFrom: %@", recognizer);
    // Add real code here
}

ジェスチャーの完全なリストはここにあります。

ああ、それでもタップを使いたいのなら、このスタックオーバーフローの質問をチェックしてください。提示された方法が完全に機能するかどうかはわかりませんが、開始するのに適した場所です。


UITableViewでのUITapGestureRecognizerの使用:わかりました。タップジェスチャはユースケースに適しているように思われるので、次のことを試してみてください。ステップ1は、長押しジェスチャの代わりにタップジェスチャを使用して、上記のジェスチャレコグナイザを設定することです。

viewDidLoadのコードは非常に似ていますが、重要な追加があります...

UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
// we need to set the gesture delegate so we can allow the tap to pass through to the
// UITableViewCell if necessary.
gesture.delegate = self;
[self.tableView addGestureRecognizer:gesture];

handleTapFrom:関数はほとんど同じですが、パラメーターとしてジェスチャレコグナイザーが異なります。

- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
    NSLog(@"handleTapFrom: %@", recognizer);
    // Add real code here
}

このアプローチの主な変更点は、UIGestureRecognizerDelegateプロトコルを実装する必要があることです。私たちの目標は、タップジェスチャがUITableViewを通過してそのサブビュー(つまり、UITableViewCellとそのコンポーネント)に到達できるようにすることなので、gestureRecognizer:shouldRecieveTouch:関数を実装する必要があります。次の実装は、あなたが試みていることをカバーするはずです。

#pragma mark UIGestureRecognizerDelegate methods
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    // If the view that is touched is not the view associated with this view's table view, but
    // is one of the sub-views, we should not recognize the touch.
    if (touch.view != self.tableView && [touch.view isDescendantOfView:self.tableView]) {
        return NO;
    }
    return YES;
}

isDescendantOfView:関数は、テスト対象のビューがテストを実行しているビューと同じである場合にYESを返すため、その場合に個別に対応する必要があります。self.tableViewの代わりにgestureRecognizer.viewを使用してこの関数を生成できますが、この場合は必要ないと思いました。

于 2012-05-25T14:33:59.580 に答える
1

秘訣は、ビューにタップ認識エンジンを配置するように viewController を作成することですが、デリゲート メソッド "gestureRecognizerShouldBegin" から NO を返すことで常にオプトアウトするようにします。そうすれば、ビューにタッチするたびにgestureRecognizerShouldBeginが呼び出されますが、テーブルの通常のイベント処理に干渉することはありません。

    - (void)viewDidLoad {
      [super viewDidLoad];
      [self detectTouchesOnView:self.tableView];
    }

    - (void)detectTouchesOnView:(UIView*)theView {
      UITapGestureRecognizer* tapR = [[UITapGestureRecognizer alloc]initWithTarget:nil action:nil];
      tapR.delegate = self;
      [theView addGestureRecognizer:tapR];
    }

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
       // React to the UITableView being touched E.G. by hiding the keyboard as below.
      [self.view endEditing:YES]; 
      return NO;
    }
于 2014-07-10T01:11:44.130 に答える