automaticallyAdjustsScrollViewInsets que no funcionan


He creado una aplicación de demostración extremadamente simple para probar la funcionalidad de automaticallyAdjustsScrollViewInsets, pero la última celda de la vista de tabla está cubierta por mi barra de pestañas.

Mi código de AppDelegate:

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

[self.window setRootViewController:tabControl];

Mi código TestViewController (subclase de 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;
}

¿Es esto un error en iOS 7? Si no, ¿qué hice mal?

Author: Pang, 2014-01-12

6 answers

Creo que automaticallyAdjustsScrollViewInsets solo funciona cuando sus controladores view es un UIScrollView (una vista de tabla es una).

Tu problema parece ser que el view de tu controlador es un UIView normal y tu UITableView es solo una subview, así que tendrás que:

  • Haga que la vista de tabla sea la vista" raíz".

  • Ajustar las inserciones manualmente:

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

Editar:

Parece que el SDK es capaz de ajustar algunas vistas de desplazamiento a pesar de no ser la vista raíz del controlador.

Hasta ahora funciona con UIScrollView y UIWebView's scrollView cuando se la subvista en el índice 0.

De todos modos, esto puede cambiar en futuras versiones de iOS, por lo que está más seguro ajustando las inserciones usted mismo.

 54
Author: Rivera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-14 12:31:57

Su controlador de vista debe estar directamente en la pila de UINavigaitonController para que automaticallyAdjustsScrollViewInsets funcione (es decir, no es un controlador de vista hijo)

Si es un controlador de vista hijo de otro controlador de vista que está en la pila de navegación, puede establecer automaticallyAdjustsScrollViewInsets = NO en el padre. Alternativamente puedes hacer esto:

self.parentViewController.automaticallyAdjustsScrollViewInsets = NO;
 18
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-14 17:48:32

Sé que este post es un poco viejo, pero acabo de resolver este problema con iOS 11 y swift 4, mi problema actual era que iOS11 tiene una nueva propiedad para validar las inserciones cuando existe un ScrollView, que es contentInsetAdjustmentBehavior que es una propiedad de ScrollView y la propiedad por defecto es automatic así que mi código era:

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

Espero que esto resuelva sus problemas también...

 10
Author: DariusV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-14 20:54:20

Tengo esta jerarquía:

  1. Navigationcontroller personalizado contiene tabbarcontroller personalizado

  2. Tabbarcontroller personalizado contiene varios controladores

  3. Estos controladores contienen subviews y uno de ellos contiene una subclase de uiscrollview.

Tuve que establecer automáticamente Yadjustsscrollviewinsets a NO

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

    self.automaticallyAdjustsScrollViewInsets = NO;

En el tabbarcontroller personalizado. Otros controladores en la jerarquía no tienen ningún impacto en el comportamiento de la vista de desplazamiento anidado.

 2
Author: Vladimír Slavík,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-04 19:49:49

Estaba teniendo el mismo problema, una vista de tabla con relleno superior no deseado.

Todas las respuestas dicen que arreglar estableciendo automaticallyAdjustsScrollViewInsets = NO, pero eso no fue eliminar el relleno para mí.

Al igual que las otras respuestas aquí, estas direcciones deben modificarse ligeramente si está utilizando una jerarquía de vistas no estándar.

Tenía un UIViewController con un UITableViewController incrustado. No estaba funcionando establecer automaticallyAdjustsScrollViewInsets en el Controlador de vista de tabla.

En su lugar, puse automaticallyAdjustsScrollViewInsets = NO en el parent UIViewController que estaba incrustando mi Controlador de vista de tabla. Eso eliminó con éxito el relleno en la vista de tabla.

 2
Author: pkamb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-29 11:01:00
self.textView.contentInset = UIEdgeInsetsMake(1.0,0.0,0,0.0);
[self setEdgesForExtendedLayout:UIRectEdgeNone];
 -3
Author: Artur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-05 15:10:14