web-dev-qa-db-fra.com

ajuste automatiquementScrollViewInsets ne fonctionne pas

J'ai créé une application de démonstration extrêmement simple pour tester les fonctionnalités de automaticallyAdjustsScrollViewInsets, mais la dernière cellule de tableView est couverte par ma barre d'onglets.

Mon code AppDelegate:

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

[self.window setRootViewController:tabControl];

Mon testViewController (sous-classe de 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;
}

Est-ce un bug dans iOS 7? Sinon, qu'est-ce que j'ai fait de mal?

29
danielmhanover

Je pense que automaticallyAdjustsScrollViewInsets ne fonctionne que lorsque vos contrôleurs view est un UIScrollView (une vue de table en est une).

Votre problème semble être que le view de votre contrôleur est un UIView normal et votre UITableView n'est qu'une sous-vue, vous devrez donc:

  • Faites de la vue de la table la vue "racine".

  • Ajustez les encarts manuellement:

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

Modifier:

On dirait que le SDK est capable d'ajuster certaines vues de défilement bien qu'il ne s'agisse pas de la vue racine du contrôleur.

Jusqu'à présent, cela fonctionne avec UIScrollView et UIWebView's scrollView quand ils sont la sous-vue à l'index 0.

Quoi qu'il en soit, cela pourrait changer dans les futures versions d'iOS, vous êtes donc plus sûr d'ajuster les encarts vous-même.

54
Rivera

Votre contrôleur de vue doit être directement sur une pile UINavigaitonController pour que automaticallyAdjustsScrollViewInsets fonctionne (c'est-à-dire pas un contrôleur de vue enfant)

S'il s'agit d'un contrôleur de vue enfant d'un autre contrôleur de vue qui se trouve sur la pile de navigation, vous pouvez plutôt définir automaticallyAdjustsScrollViewInsets = NO sur le parent. Vous pouvez également le faire:

self.parentViewController.automaticallyAdjustsScrollViewInsets = NO;
19
Robert

Je sais que ce message est un peu ancien, mais je viens de résoudre ce problème avec iOS 11 et Swift 4, mon problème actuel était qu'iOS11 a une nouvelle propriété pour valider les encarts lorsqu'un ScrollView existe, celui-ci est contentInsetAdjustmentBehavior qui est la propriété d'un ScrollView et la propriété par défaut est automatic donc mon code était:

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

J'espère que cela résoudra aussi vos problèmes ...

15
DariusV

J'avais le même problème, une vue de table avec un rembourrage supérieur indésirable.

Toutes les réponses disent de corriger en définissant automaticallyAdjustsScrollViewInsets = NO, mais cela n'éliminait pas le rembourrage pour moi.

Semblable aux autres réponses ici, ces directions doivent être légèrement modifiées si vous utilisez une hiérarchie de vues non standard.

J'avais un UIViewController avec un UITableViewController intégré. Il ne fonctionnait pas pour définir automaticallyAdjustsScrollViewInsets sur le Table View Controller.

Au lieu de cela, j'ai défini automaticallyAdjustsScrollViewInsets = NO sur le parent UIViewController qui incorporait mon contrôleur de vue de table. Cela a éliminé avec succès le remplissage de la vue Table.

2
pkamb

J'ai cette hiérarchie:

  1. navigationcontroller personnalisé contient tabbarcontroller personnalisé

  2. tabbarcontroller personnalisé contient plusieurs contrôleurs

  3. ces contrôleurs contiennent des sous-vues et l'un d'eux contient une sous-classe de uiscrollview.

J'ai dû définir automatiquementAdjustsScrollViewInsets sur NO

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

    self.automaticallyAdjustsScrollViewInsets = NO;

dans le tabbarcontroller personnalisé. Les autres contrôleurs de la hiérarchie n'ont aucun impact sur le comportement de la vue de défilement imbriquée.

2