He creado una muy sencilla aplicación demo para probar la funcionalidad de automaticallyAdjustsScrollViewInsets, pero la última celda del formato tableview está cubierto por mi barra de pestañas.

Mi AppDelegate código:

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

[self.window setRootViewController:tabControl];

Mi testViewController (subclase de UITableViewController) Código:

- (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 bug en iOS 7? Si no, ¿qué hice mal?

6 Comentarios

  1. 54

    Creo que automaticallyAdjustsScrollViewInsets sólo funciona cuando sus controladores view es un UIScrollView (una vista de tabla es uno).

    Estás problema parece ser que el controlador del view es un habitual UIView y su UITableView es sólo una subvista, por lo que tendrá que:

    • Hacer la tabla de la vista de la «raíz» de la vista.

    • Ajustar los márgenes de forma manual:

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

    Edición:

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

    Hasta ahora funciona con UIScrollView‘s 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 el ajuste de los márgenes de sí mismo.

    • Me enteré de que sólo funciona si hay un scrollview en el índice 0 del viewcontroller opinión de subvistas
    • Acaba de confirmar que ahora. Es muy interesante, con UIWebView‘s como el desplazamiento de la vista es aún más profundo en la vista de jerarquía.
    • +1 para el índice 0 bit; me ayudó con un problema que tuve con una vista web no está ajustado.
    • Esto es fantástico trabajo de detective!
    • No puedo creer que 0 índice cosa. La cantidad de veces que he tenido problemas con esta configuración, para ahora saber que fue algo tan estúpido como eso. Apple realmente necesita para advertir acerca de esta limitación. De todos modos, me puede confirmar esto también funciona en una UICollectionView.
    • Lo que es más, me enteré de que si usted tiene más de un desplazamiento de la vista en la vista de jerarquía (incluso si sólo uno está instalado en el momento), no funciona incluso si el desplazamiento de la vista está en el índice 0 en subvistas. Sólo funcionó cuando me quitó completamente el otro desplazamiento puntos de vista de guión gráfico. Por lo que esta propiedad es desastre total para mí…
    • En iOS 11, en lugar de establecer cada niño controlador de desplazamiento del punto de vista, se puede establecer additionalSafeAreaInsets en el padre (tab bar controller), y todos los hijos heredarán

  2. 20

    Su vista controlador debe estar directamente sobre un UINavigaitonController de la pila para automaticallyAdjustsScrollViewInsets a trabajar (es decir, no es un niño vista controlador)

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

    self.parentViewController.automaticallyAdjustsScrollViewInsets = NO;
    • Esta respuesta me ayudó. En mi caso, el controlador de vista de los que ha conseguido la vista de tabla fue añadido a su padre usando addChildViewController. Configuración de self.automaticallyAdjustsScrollViewInsets = NO; en que el niño no era suficiente. Tienes que ponerlo en el padre también, porque parece que de forma recursiva taladro hacia abajo y busque todos desplazamiento vistas a establecer automáticamente sus márgenes.
  3. 15

    Sé que este post es un poco viejo, pero me acaba de resolver este problema con iOS 11 y swift 4, mi problema era que iOS11 tiene una nueva propiedad para validar los recuadros cuando un ScrollView no existe, que uno es contentInsetAdjustmentBehavior que es un ScrollView de la propiedad y de la propiedad predeterminada es automatic así que mi código:

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

    Espero que esto resuelva tus problemas también…

    • ¿qué es myScroll aquí?
    • Sería un simple scrollview o un formato tableview, collectionview… mira este developer.apple.com/documentation/uikit/uiscrollview/…
    • Me estaba preguntando qué pasó con automaticallyAdjustsScrollViewInsets en iOS 11.. gracias!
    • Fue justo en desuso, seguramente es porque tiene más sentido para controlar el Desplazamiento del comportamiento de sí mismo, en lugar de un ViewController de la propiedad
  4. 2

    Tengo esta jerarquía:

    1. personalizado navigationcontroller contiene personalizado tabbarcontroller

    2. personalizado tabbarcontroller contiene varios controladores de

    3. estos controladores contiene subvistas y uno de ellos contiene una subclase de uiscrollview.

    Tuve que establecer automaticallyAdjustsScrollViewInsets para NO

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

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

    • Yo también tenía un comportamiento extraño con un simple UITextView.
  5. 2

    Yo estaba teniendo el mismo problema, una Vista de Tabla con el margen superior.

    Todas las respuestas dicen que para solucionar estableciendo automaticallyAdjustsScrollViewInsets = NO, pero que no fue eliminando el relleno para mí.

    Similar a la de las otras respuestas aquí, estas instrucciones deben ser ajustado ligeramente si usted está usando un estándar de jerarquía.

    Tuve un UIViewController con una incrustado UITableViewController. No estaba trabajando para establecer automaticallyAdjustsScrollViewInsets en la Tabla de Controlador de Vista.

    Lugar, me puse automaticallyAdjustsScrollViewInsets = NO en el padre UIViewController que fue la incrustación de mi Mesa de Controlador de Vista. Que ha logrado eliminar el relleno en la Vista de Tabla.

  6. -4
    self.textView.contentInset = UIEdgeInsetsMake(1.0,0.0,0,0.0);
    [self setEdgesForExtendedLayout:UIRectEdgeNone];
    • Por favor, no basta con copiar / pegar dos líneas de código sin ningún tipo de explicación.

Dejar respuesta

Please enter your comment!
Please enter your name here