2014-01-11 4 views
28

Ich habe eine sehr einfache Demo-App erstellt, um die Funktionalität von automaticallyAdjustsScrollViewInsets zu testen, aber die letzte Zelle der TableView wird durch meine Tab-Leiste abgedeckt.automaticallyAdjustScrollViewInsets funktioniert nicht

Mein AppDelegate Code:

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

[self.window setRootViewController:tabControl]; 

Mein testViewController (Unterklasse von UITableViewController) Code:

- (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; 
} 

Ist das ein Bug in iOS 7? Wenn nicht, was habe ich falsch gemacht?

Antwort

52

Ich denke, dass automaticallyAdjustsScrollViewInsets nur funktioniert, wenn Ihre Controller view ist ein UIScrollView (eine Tabellenansicht ist eine).

Du bist Problem scheint zu sein, dass Ihr Controller view ist eine regelmäßiges UIView und Ihr UITableView ist nur ein Subview, so dass Sie entweder haben werden:

  • die Tabelle der „root“ anzuzeigen Stellen Aussicht.

  • einstellen Einsätze manuell:

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

Edit:

Scheint, wie das SDK einige Scroll-Ansichten der Einstellung trotz nicht wobei die Steuerung Root-Ansicht kann.

Bisher Es arbeitet mit UIScrollView 's und UIWebView' s scrollView, wenn sie die subview bei Index 0 sind.

Wie auch immer, dies kann sich in zukünftigen iOS-Versionen ändern, so dass Sie selbst die Einstellungen sicherer anpassen können.

+22

ich fand heraus, dass es nur, wenn es funktioniert Die View Subviews des Viewcontrollers –

+0

Das habe ich jetzt gerade bestätigt. Es ist interessant mit 'UIWebView's, da die Bildlaufansicht in der Ansichtshierarchie noch tiefer ist. – Rivera

+0

+1 für den Index 0 Bit; half mir bei einem Problem, das ich mit einer Webansicht hatte, die nicht angepasst wurde. –

2

Ich habe diese Hierarchie:

  1. benutzerdefinierte Navigation enthält benutzerdefinierte TabBarController

  2. benutzerdefinierte TabBarController enthält mehrere Controller

  3. diese Controller enthält Subviews und einer von ihnen enthält eine Unterklasse von UIScrollView.

Ich hatte automaticallyAdjustsScrollViewInsets auf NO

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

    self.automaticallyAdjustsScrollViewInsets = NO; 

im benutzerdefinierten TabBarController einzustellen. Andere Controller in der Hierarchie haben keinen Einfluss auf das Verhalten der geschachtelten Scroll-Ansicht.

+0

I, hatte auch seltsames Verhalten mit einem einfachen UITextView. –

16

Ihr View-Controller muss direkt auf dem Stack eines UINavigaitonControllers für automaticallyAdjustsScrollViewInsets arbeiten (d. H.kein Kinderansicht-Controller)

Wenn es sich um einen untergeordneten Ansichtscontroller eines anderen Ansichtscontrollers handelt, der sich auf dem Navigationsstapel befindet, können Sie stattdessen automaticallyAdjustsScrollViewInsets = NO auf dem übergeordneten Element festlegen. Alternativ können Sie dies tun:

self.parentViewController.automaticallyAdjustsScrollViewInsets = NO; 
+0

Diese Antwort hat mir geholfen. In meinem Fall wurde der View-Controller, der die Tabellenansicht verwaltet, mit 'addChildViewController' zum übergeordneten Element hinzugefügt. Die Einstellung 'self.automaticallyAdjustScrollViewInsets = NO;' auf dem Kind war nicht genug. Sie müssen es auch auf das Parent setzen, da es scheinbar rekursiv nach Drilldowns sucht und alle Scroll-Ansichten lokalisiert, um seine Einfügungen automatisch festzulegen. – Pwner

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

Bitte kopieren und fügen Sie zwei Zeilen Code nicht ohne Erklärung ein. – jeffjv

2

ich das gleiche Problem, eine Tabellenansicht mit unerwünschter Top-Polsterung.

Alle Antworten sagen, um durch die Einstellung automaticallyAdjustsScrollViewInsets = NO zu beheben, aber das war nicht die Beseitigung der Polsterung für mich.

Ähnlich wie bei den anderen Antworten müssen diese Anweisungen leicht angepasst werden, wenn Sie eine nicht standardmäßige Ansichtshierarchie verwenden.

Ich hatte einen UIViewController mit einem eingebetteten UITableViewController. Es funktionierte nicht automaticallyAdjustsScrollViewInsets auf dem Table View Controller zu setzen.

Stattdessen setze ich automaticallyAdjustsScrollViewInsets = NO auf die übergeordnete UIViewController, die meine Table View Controller eingebettet wurde. Das hat das Auffüllen der Tabellenansicht erfolgreich beseitigt.

5

Ich weiß, dass dieser Beitrag ein wenig alt ist, aber ich habe gerade dieses Problem mit iOS 11 und swift 4 gelöst, mein aktuelles Problem war, dass iOS11 eine neue Eigenschaft hat, um die Einsätze zu validieren, wenn eine ScrollView existiert, die contentInsetAdjustmentBehavior ist ist eine Eigenschaft und die Standardeigenschaft ist automatic des Scroll so mein Code war: ein Scroll bei Index 0 von

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

ich dies auch Ihre Probleme zu lösen hoffen ...

+0

Was ist 'myScroll' hier? –

+0

Es wäre eine einfache Scrollview oder eine Tabellenansicht, Collectionview ... sieh dir das an https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior – DariusV

+0

Ich habe mich nur gefragt, was passiert ist mit "automatisch AdjustScrollViewInsets" in iOS 11 .. danke! – carlodonz