14

メソッドに奇妙な問題があり、うまくいかないtopLayoutGuide状況で使用する必要があります。setAutomaticallyAdjustsScrollViewInsets:問題の原因を絞り込むために、次の最小限の例を作成しました。これは、テスト用の基本的なテーブル ビューをセットアップするだけです。

  1. Xcode で新しい iOS シングル ビュー アプリケーションをセットアップします。
  2. 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. でマークされた行のコメントを外すと[1]、正しいインセットが適用されますが、テーブル ビューのスクロールが機能しなくなります。スクロールしようとすると、指を離した後、テーブルが最初のスクロール位置に跳ね返ります。[self topLayoutGuide]この動作は、結果を何も割り当てずに、への単純な呼び出しによってもトリガーされます。

  2. [2] の代わりに行のコメントを外すと[1]、スクロールが機能します。100 pt のインセットも適用されます。ただし、コンテンツがステータスバーの下に重なるように、最初のスクロール位置が自動的に調整されるようになりました。

( [*]: これは実際には、含まれているナビゲーション コントローラーと組み合わせて何かを行うだけのようです。この例では違いがないように見えますが、念のために自動動作を無効にしたいと思います。)

私が間違っていることは明らかですか?私はここで本当に途方に暮れています。

4

2 に答える 2

2

topLayoutGuideを取得する代わりに、私と同じことを試してください:

CGFloat topOffset = CGRectGetMaxY(self.refController.navigationController.navigationBar.frame);
于 2014-08-01T03:50:59.293 に答える