2011-12-20 5 views
0

カスタムセルを含むグループ化されたテーブルビューがあり、多くのセル(スクロール可能)を含んでいます。すべてのセルにはスクロールビューがあります(UILabel )、スクロールビューを適切に設定しました(スクロールが正しく動作するようにフレームサイズよりも大きなコンテンツサイズを作成し、それをカスタムセルのサブビューとして追加しました)。ただし、このスクロールビューの内部にあるがスクロールできない(スクロールバーなし、スクロールなし...)、画面上のスクロール可能なオブジェクトはグループ化されたテーブルビューのデフォルトのスクロールビューのみです。カスタムuitableviewセルのuiscrollviewはスクロールできない(またはアクセス可能)

どのようにスクロール表示を正しくスクロールできますか?

ありがとうございます。

+0

テキストをスクロールすることを意味する場合、またはテーブルをスクロールすることをアプリがどのように知っていますか?あなたのスクロールビューがセルビューの一部を占めるにすぎないとしても、ユーザーはインターフェイスによって混乱し、動作しないと思うでしょう。 – ader

+0

アプリは次のように知っているでしょう:ミニスクロールビューのフレーム内をタップすると、各セルの内側にスクロールする必要があります(もちろん大きなテキストがある場合)。そして、セルのフレームの枠の外側をタップすると、テーブルビューの選択を有効にして、目的のスクロールを提供する必要があります。 – JAHelia

+0

あなたの細胞はどれくらい高いと思っていますか?私は、あなたのユーザーがインターフェイスで混乱し、それが動作しないと思うと思う。私はあなたのUI設計を再検討することをお勧めします。たぶん垂直ページングを使ったスクロールビューがうまくいくでしょう。 – ader

答えて

3

touchesBeganとtouchesEndedをスクロールビューに実装していますか?

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event]; 
    [[self nextResponder] touchesBegan:touches withEvent:event]; 
} 


- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent *)event 
{ 
    [super touchesEnded:touches withEvent:event]; 
    [[self nextResponder] touchesEnded:touches withEvent:event]; 
} 

もしそうでない場合は、スクロールビュー(scrollviewサブクラス)のクラスを作成して実装します。

+0

私はスクロールビューをサブクラス化し、タッチをカスタマイズして終了メソッドをタッチする必要がありますか?私はこれらの方法で何を置くべきですか? – JAHelia

+1

私はあなたがタッチを伝播する必要があると思っています(上記のように)。 – ader

+0

私はuiscrollviewをサブクラス化し、テストのためにこれらのメソッドをNSLogsに入れましたが、ログメッセージは表示されませんでした!スクロールするか、テーブルビューのメインスクロールビューをスクロールするかを指定するために、ミニスクロールビューでジェスチャーを検出する必要がありますが、それを行う方法はわかりませんが、そのアイデアはありますか? – JAHelia

0

ここには、スクロールビューのサブクラスに書き込まれる内容の完全なコードがあります。 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.delegateUITableViewCellではない場合は、そのプロパティをセルのプロパティに置き換えてください。

セルは、望ましくない結果を防ぐために移動中にキャンセルタッチイベントを取得する必要があります。それは以下のように容易に再現可能である。セルが強調表示されている間

  • (スクロールビューを強調表示していない場合は、スクロールビューのセル全体の上にあると仮定した場合)

    • ハイライトセルは、テーブルビュー
    • をドラッグし、他のセルを選択し、今以前にハイライト表示されたセルは、didSelectCellの状態を取得します

    もう1つのポイントは問題です。 self.delegateself.superviewの前に呼び出されていない場合は、強調表示された状態は発生しません。