メソッドに奇妙な問題があり、うまくいかないtopLayoutGuide
状況で使用する必要があります。setAutomaticallyAdjustsScrollViewInsets:
問題の原因を絞り込むために、次の最小限の例を作成しました。これは、テスト用の基本的なテーブル ビューをセットアップするだけです。
- Xcode で新しい iOS シングル ビュー アプリケーションをセットアップします。
ViewController.m の実装に次のコードを貼り付けます。
@implementation ViewController - (void)loadView { [self setTableView:[[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]]; } - (void)viewDidLoad { [super viewDidLoad]; [self setAutomaticallyAdjustsScrollViewInsets:NO]; // [*] } - (void)viewDidLayoutSubviews { UITableView *tableView = [self tableView]; UIEdgeInsets insets = [tableView contentInset]; // insets.top = [[self topLayoutGuide] length]; // [1] // insets.top = 100; // [2] [tableView setContentInset:insets]; [tableView setScrollIndicatorInsets:insets]; } #pragma mark - Table view data source - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 100; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } [[cell textLabel] setText:[NSString stringWithFormat:@"%d", [indexPath row]]]; return cell; } @end
私が抱えている問題は次のとおりです。
でマークされた行のコメントを外すと
[1]
、正しいインセットが適用されますが、テーブル ビューのスクロールが機能しなくなります。スクロールしようとすると、指を離した後、テーブルが最初のスクロール位置に跳ね返ります。[self topLayoutGuide]
この動作は、結果を何も割り当てずに、への単純な呼び出しによってもトリガーされます。[2]
の代わりに行のコメントを外すと[1]
、スクロールが機能します。100 pt のインセットも適用されます。ただし、コンテンツがステータスバーの下に重なるように、最初のスクロール位置が自動的に調整されるようになりました。
( [*]
: これは実際には、含まれているナビゲーション コントローラーと組み合わせて何かを行うだけのようです。この例では違いがないように見えますが、念のために自動動作を無効にしたいと思います。)
私が間違っていることは明らかですか?私はここで本当に途方に暮れています。