2014-01-11 28 views
28

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

私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のバグですか?そうでなければ、私は何を間違えたのですか?

答えて

52

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

あなたは問題だが、コントローラのviewは、定期的なUIViewであり、あなたはどちらかにありますので、あなたのUITableViewは、ちょうどサブビューであることのようだ:

  • テーブルには「ルート」を参照してくださいビュー。

  • 手動インセットの調整:

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

編集:

をSDKは、コントローラのルートビューでないにも関わらず、いくつかのスクロールビューを調整することが可能であるように思えます。

これまでのところ、インデックス0のサブビューでは、UIScrollViewUIWebViewscrollViewで動作します。

これは今後のiOSリリースでは変更される可能性がありますので、自分でインセットを安全に調整してください。

+22

viewcontrollerのビューのサブビュー –

+0

今すぐ確認しました。スクロールビューはビュー階層内でさらに深いので、UIWebViewでは面白いです。 – Rivera

+0

インデックス0ビットの場合は+1、調整されていないWebビューで問題が発生したときに役立ちました。 –

2

私はこの階層を持っている:

  1. カスタムnavigationcontrollerは、カスタムtabbarcontroller

  2. カスタムtabbarcontrollerが含まれていますが、これらのコントローラは、サブビューが含まれており、そのうちの一つは、UIScrollViewのサブクラスが含まれている複数のコントローラ

  3. が含まれています。

私はカスタムtabbarcontroller にNO

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

    self.automaticallyAdjustsScrollViewInsets = NO; 

にautomaticallyAdjustsScrollViewInsetsを設定する必要がありました。階層内の他のコントローラは、ネストされたスクロールビューの動作に影響を与えません。

+0

I、単純なUITextViewで奇妙な動作をしました。 –

16

automaticallyAdjustsScrollViewInsetsを動作させるには、表示コントローラを直接UINavigaitonControllerのスタックに配置する必要があります。子ビューコントローラではない)

ナビゲーションスタック上にある別のビューコントローラの子ビューコントローラの場合は、代わりに親にautomaticallyAdjustsScrollViewInsets = NOを設定できます。私は同じ問題、不要なトップパディングとテーブルビューを持っていた

self.parentViewController.automaticallyAdjustsScrollViewInsets = NO; 
+0

この回答は私を助けました。私の場合、テーブルビューを管理していたビューコントローラは、 'addChildViewController'を使ってその親に追加されました。子の 'self.automaticallyAdjustsScrollViewInsets = NO;'を設定するだけでは不十分でした。再帰的にドリルダウンしてすべてのスクロールビューを検索してそのインセットを自動的に設定するように見えるので、親にも設定する必要があります。 – Pwner

-4
self.textView.contentInset = UIEdgeInsetsMake(1.0,0.0,0,0.0); 
[self setEdgesForExtendedLayout:UIRectEdgeNone]; 
+3

2行のコードを何も説明せずにコピー/ペーストしないでください。 – jeffjv

2

:別の方法としては、これを行うことができます。

すべての回答は、automaticallyAdjustsScrollViewInsets = NOを設定して修正するとしていますが、それは私のための埋め込みを排除していませんでした。

標準以外のビュー階層を使用している場合は、他の回答と同様に、これらの方向を微調整する必要があります。

私は、埋め込まれたUITableViewControllerを持つUIViewControllerを持っていました。テーブルビューコントローラでautomaticallyAdjustsScrollViewInsetsを設定しようとしていませんでした。

代わりに、automaticallyAdjustsScrollViewInsets = NOに設定しました。私のテーブルビューコントローラを埋め込んでいたUIViewControllerです。これにより、テーブルビュー上のパディングが無くなりました。

5

私はこの記事を少し古く知っていますが、iOS 11とswift 4でこの問題を解決しました。現在の問題は、iOS11にScrollViewが存在するときにiOS11に新しいプロパティがあり、その1つがcontentInsetAdjustmentBehavior ScrollViewのプロパティがあり、デフォルトのプロパティがautomaticあるので、私のコードだった:私は、これはあまりにもあなたの問題を解決を願ってい

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

...

私はscrollviewがある場合、それが唯一のインデックス0で動作していることが分かった
+0

ここでは 'myScroll'とは何ですか? –

+0

これは簡単なスクロールビューやテーブルビュー、コレクションビューです。https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior – DariusV

+0

iOSの 'automaticallyAdjustsScrollViewInsets'に何が起こったのか不思議でした11 ..ありがとう! – carlodonz