web-dev-qa-db-ja.com

自動的にAdjustsScrollViewInsetsが機能しない

automaticallyAdjustsScrollViewInsetsの機能をテストするための非常にシンプルなデモアプリを作成しましたが、tableViewの最後のセルはタブバーで覆われています。

私のAppDelegateコード:

UITabBarController *tabControl = [[UITabBarController alloc] init];
tabControl.tabBar.translucent = YES;
testViewController *test = [[testViewController alloc] init];
[tabControl setViewControllers:@[test]];

[self.window setRootViewController:tabControl];

私のtestViewController(UITableViewControllerのサブクラス)コード:

- (void)viewDidLoad
{
[super viewDidLoad];
self.automaticallyAdjustsScrollViewInsets = YES;
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.dataSource = self;
self.tableView.scrollIndicatorInsets = self.tableView.contentInset;
//[self.view addSubview:self.tableView];

// Do any additional setup after loading the view.
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@""];
cell.textLabel.text = @"test";
return cell;
}

これはiOS 7のバグですか?そうでない場合、私は何を間違えましたか?

29
danielmhanover

automaticallyAdjustsScrollViewInsetsは、コントローラーviewUIScrollView(テーブルビューが1つ)の場合にのみ機能すると思います。

コントローラーのviewが通常のUIViewであり、UITableViewが単なるサブビューであるという問題があるようです。そのため、次のいずれかを行う必要があります。

  • テーブルビューを「ルート」ビューにします。

  • インセットを手動で調整します。

    UIEdgeInsets insets = UIEdgeInsetsMake(controller.topLayoutGuide.length,
                                           0.0,
                                           controller.bottomLayoutGuide.length,
                                           0.0);
    scrollView.contentInset = insets;
    

編集:

SDKはコントローラーのルートビューではないにもかかわらず、一部のスクロールビューを調整できるようです。

これまでのところ、UIScrollViewUIWebViewscrollViewがインデックス0

とにかく、これは将来のiOSリリースで変更される可能性があるため、インセットを自分で調整する方が安全です。

54
Rivera

automaticallyAdjustsScrollViewInsetsが機能するには、View ControllerがUINavigaitonControllerのスタック上に直接存在する必要があります(つまり、子View Controllerではありません)

ナビゲーションスタック上にある別のView Controllerの子View Controllerである場合、代わりにautomaticallyAdjustsScrollViewInsets = NO親。あるいは、これを行うことができます:

self.parentViewController.automaticallyAdjustsScrollViewInsets = NO;
19
Robert

私はこの投稿が少し古いことを知っていますが、iOS 11でこの問題を解決しましたSwift 4、私の現在の問題はiOS11にScrollViewが存在するときにインセットを検証する新しいプロパティがあることです、それは contentInsetAdjustmentBehavior で、これはScrollViewのプロパティであり、デフォルトのプロパティはautomaticであるため、私のコードは次のとおりでした。

if #available(iOS 11, *) {
    myScroll.contentInsetAdjustmentBehavior = .never
} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

これもあなたの問題を解決することを望みます...

15
DariusV

私は同じ問題、望ましくない上部パディングを含むテーブルビューを抱えていました。

すべての回答は、automaticallyAdjustsScrollViewInsets = NO、しかし、それは私のためのパディングを排除していませんでした。

ここでの他の回答と同様に、非標準のビュー階層を使用している場合、これらの指示を少し調整する必要があります。

UITableViewControllerが埋め込まれたUIViewControllerがありました。 Table View ControllerでautomaticallyAdjustsScrollViewInsetsを設定しても機能していませんでした。

代わりに、automaticallyAdjustsScrollViewInsets = NO on parent私のTable View Controllerを組み込んでいたUIViewController。これにより、テーブルビューのパディングが正常に削除されました。

2
pkamb

この階層があります:

  1. カスタムNavigationControllerにはカスタムTabbarControllerが含まれます

  2. カスタムtabbarcontrollerには複数のコントローラーが含まれます

  3. これらのコントローラーにはサブビューが含まれ、そのうちの1つにはuiscrollviewのサブクラスが含まれます。

自動的にAdjustsScrollViewInsetsをNOに設定する必要がありました

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    self.automaticallyAdjustsScrollViewInsets = NO;

カスタムtabbarcontrollerで。階層内の他のコントローラーは、ネストされたスクロールビューの動作に影響を与えません。

2