ここには、スクロールビューのサブクラスに書き込まれる内容の完全なコードがあります。 touchesMoved
で
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (self.dragging) {
[super touchesBegan:touches withEvent:event];
} else {
[self.superview touchesBegan:touches withEvent:event];
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
if (self.dragging) {
[super touchesMoved:touches withEvent:event];
} else {
if ([self.delegate isKindOfClass:[UITableViewCell class]]) {
[(UITableViewCell *)self.delegate touchesCancelled:touches withEvent:event];
}
[self.superview touchesMoved:touches withEvent:event];
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if (self.dragging) {
[super touchesEnded:touches withEvent:event];
} else {
[self.superview touchesEnded:touches withEvent:event];
}
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
if (self.dragging) {
[super touchesCancelled:touches withEvent:event];
} else {
[self.superview touchesMoved:touches withEvent:event];
}
}
私が遭遇したバグに基づいていくつかの余分なコードがあります。まず、self.delegate
がUITableViewCell
ではない場合は、そのプロパティをセルのプロパティに置き換えてください。
セルは、望ましくない結果を防ぐために移動中にキャンセルタッチイベントを取得する必要があります。それは以下のように容易に再現可能である。セルが強調表示されている間
(スクロールビューを強調表示していない場合は、スクロールビューのセル全体の上にあると仮定した場合)
- ハイライトセルは、テーブルビュー
- をドラッグし、他のセルを選択し、今以前にハイライト表示されたセルは、
didSelectCell
の状態を取得します
もう1つのポイントは問題です。 self.delegate
がself.superview
の前に呼び出されていない場合は、強調表示された状態は発生しません。
テキストをスクロールすることを意味する場合、またはテーブルをスクロールすることをアプリがどのように知っていますか?あなたのスクロールビューがセルビューの一部を占めるにすぎないとしても、ユーザーはインターフェイスによって混乱し、動作しないと思うでしょう。 – ader
アプリは次のように知っているでしょう:ミニスクロールビューのフレーム内をタップすると、各セルの内側にスクロールする必要があります(もちろん大きなテキストがある場合)。そして、セルのフレームの枠の外側をタップすると、テーブルビューの選択を有効にして、目的のスクロールを提供する必要があります。 – JAHelia
あなたの細胞はどれくらい高いと思っていますか?私は、あなたのユーザーがインターフェイスで混乱し、それが動作しないと思うと思う。私はあなたのUI設計を再検討することをお勧めします。たぶん垂直ページングを使ったスクロールビューがうまくいくでしょう。 – ader