6

iPad アプリ (OS X 10.7.3、Xcode 4.3.2) で自動的に少し下にスクロールするテーブル ビューがあり、原因を探す場所がわかりません。状況は次のとおりです。

UITableView は画面全体に表示され、ほとんどのセルは高さが固定されたセルです。1 つの例外は、UITextView を含むセルで、高さが動的です (つまり、セルの高さがテキストの量に合わせて調整されます)。

テーブル ビューが一番上にあるときにテーブルの動的な高さのセルが切り取られている場合、問題が発生します。ビューが最初にロードされると、テーブルは通常どおり描画され、UITextView セルの一部だけが表示されます。ただし、UIPopoverController を表示する場合は、ポップオーバーを閉じた後に reloadData を実行する必要があります。そうすると、テーブル ビューが下にスクロールしてすべての UITextView が表示されます。(UITextView を含むセルではなく、UITextView だけで構いません。テーブルはグループ化されたテーブルであり、UITextView セルはセクション内の唯一のセルであるため、このファントム スクロールの後、丸みを帯びた下端はまだ表示されません。)

テーブル ビューをスクロールしたり、コンテンツ オフセットを設定したりするコードがアプリに表示されないため、何が原因なのか完全に混乱しています。

絞り込むために、UIScrollViewDelegate を尊重するようにビューを設定しました。scrollViewDidScroll: メソッドにブレークポイントを設定すると、ポップオーバーが消えた後にプログラムは実際に停止し、次のバックトレースが表示されます。

(lldb) bt
* thread #1: tid = 0x1f03, 0x0005245f MyApp`-[ContactDisplayViewController scrollViewDidScroll:] + 31 at ContactDisplayViewController.m:1143, stop reason = breakpoint 3.1
    frame #0: 0x0005245f MyApp`-[ContactDisplayViewController scrollViewDidScroll:] + 31 at ContactDisplayViewController.m:1143
    frame #1: 0x017e3494 UIKit`-[UIScrollView setContentOffset:] + 521
    frame #2: 0x0180804d UIKit`-[UITableView setContentOffset:] + 334
    frame #3: 0x017d495e UIKit`-[UIScrollViewScrollAnimation setProgress:] + 523
    frame #4: 0x0183d234 UIKit`-[UIAnimator(Static) _advance:] + 255
    frame #5: 0x02c013a3 GraphicsServices`HeartbeatTimerCallback + 35
    frame #6: 0x023278c3 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
    frame #7: 0x02328e74 CoreFoundation`__CFRunLoopDoTimer + 1220
    frame #8: 0x022852c9 CoreFoundation`__CFRunLoopRun + 1817
    frame #9: 0x02284840 CoreFoundation`CFRunLoopRunSpecific + 208
    frame #10: 0x02284761 CoreFoundation`CFRunLoopRunInMode + 97
    frame #11: 0x02bfe1c4 GraphicsServices`GSEventRunModal + 217
    frame #12: 0x02bfe289 GraphicsServices`GSEventRun + 115
    frame #13: 0x017a4c93 UIKit`UIApplicationMain + 1160
    frame #14: 0x0000263d MyApp`main + 125 at main.m:14

そして、そのメソッドで scrollView を出力すると、UITableView が動いていることがわかります (contentOffset がどこから来ているのかわかりません)。

Printing description of scrollView:
<UITableView: 0xc3ed400; frame = (0 99; 383 817); clipsToBounds = YES; 
autoresize = W+RM+H; layer = <CALayer: 0x7bf1a40>; contentOffset: {0, 14}>

このファントム スクロールは、デバイスとシミュレーター、および iOS 4.3、5.0、および 5.1 で表示されます。誰にもアイデアはありますか?

4

3 に答える 3

1

UITextView が FirstResponder になると (iOS 3 以降)、それが UIScrollView/UITableViewController 内にある場合、その scrollview は iOS によって自動的にスクロールされ、UITextView が確実に表示されるようになります。

UITextField がファーストレスポンダーになったときに UIScrollView のスクロールを無効にする

于 2012-07-14T20:18:58.500 に答える