UITableView está comenzando con un desplazamiento en iOS 7

115

He arrastrado un UITableView simple de Jane a un UIViewController en iOS 7.

Ahora hay un desplazamiento vertical del espacio antes de que comience la primera celda. ¿Como me deshago de esto? Quiero que la primera línea esté mucho más cerca del borde superior de donde realmente comienza UITableView. No pedí la compensación grande, ¿verdad?

ingrese la descripción de la imagen aquí

¿Algunas ideas?

usuario798719
fuente
43
Lo siguiente me ayudó: YouStoryboard.storyboard> YouViewController> Inspector de atributos> Desmarcar - Ajustar las inserciones de la vista de desplazamiento.
Alexander
17
Por cierto, puede tomar una captura de pantalla del simulador de iOS usando la tecla Comando + S
Hemang
@Alexander: También me ayudaron con sus sugerencias, sin embargo, al desmarcar ExtendEdges.UnderTopBars, volvió a aparecer el espacio de desplazamiento vertical. No estoy seguro de si es uno de los (¿muchos?) Errores en Xcode6, ¡pero estos problemas me dan bastantes dolores de cabeza de vez en cuando!
iOS-Coder

Respuestas:

81

De forma predeterminada, los controladores de vista de tabla rellenarán el contenido debajo de la barra de navegación para que pueda desplazarse por el contenido debajo y verlo, en un estado borroso, debajo de la barra de navegación / barra de herramientas.

Parece que lo está colocando a 44 (tal vez 64) px para moverlo desde debajo de la barra de navegación, pero ya lo compensa, por lo que obtiene un gran espacio.

Vaya al guión gráfico / xib en IB y desmarque el contenido del programa en la barra de navegación.

Cocoadelica
fuente
6
Lo siento, ¿cómo es irrelevante el comentario sobre NDA en iOS7? Este es un foro para ayudar a la gente.
Cocoadelica
En Xcode Versión 5.1 en Viewcontroller, desmarque los bordes extendidos> Debajo de las barras superiores para eliminar la inserción superior de contenido de UITableView
Emel Elias
3
Entonces, ¿dónde se muestra el contenido debajo de la barra de navegación thigo? No lo encuentro.
Anup Kattel
10
@FrankGorman en Xcode 5.1.1 hay una opción en el guión gráfico para el controlador de vista específico Adjust Scroll View insets, elimine la marca de verificación.
korat prashant
1
hola @koratprashant. comentario muy útil.
KDeogharkar
107

La nueva implementación de iOS 7 de UIViewController tiene un nuevo conjunto de opciones que permite al desarrollador elegir si el sistema agregará automáticamente inserciones para UIScrollView , UITableView y derivaciones.

Para deshabilitar este comportamiento, desmarque estas casillas para todos sus UIViewControllers deseados en InterfaceBuilder, en el inspector de objetos seleccionados de UIViewController :

Ver inspector del controlador

Para más detalles:

  1. Envíe sus aplicaciones de iOS 7 hoy.
  2. Guía de transición de la interfaz de usuario de iOS 7> Apariencia y comportamiento
xudre
fuente
¡Gracias! Me salvaste.
rsc
68

De la guía de transición de iOS7:

Si no desea que las inserciones de contenido de una vista de desplazamiento se ajusten automáticamente, establezca automáticamenteAdjustsScrollViewInsets en NO. (El valor predeterminado de automaticallyAdjustsScrollViewInsets es YES).

   self.automaticallyAdjustsScrollViewInsets = NO;
sovanlandy
fuente
9
Esto también se puede configurar en XCode en el inspector de atributos. Desmarque la Adjust Scroll View Insetscasilla de verificación del diseño del controlador de vista.
Andrew
1
Si carga el UIViewController mediante programación (sin usar un XIB), este funciona como un encanto. Establecer automaticallyAdjustsScrollViewInsets = NOen el controlador de vista.
KabraBoja
Esto fue todo para mí. Confuso porque mi TableView estaba dentro de una vista de contenedor e inicialmente parecía estar bien. Pero se estropeó al volver a aparecer desde otro controlador de vista.
n13
¡Excelente! ¡Ahórrame mucho tiempo!
inix
34

Tuve un problema similar, después de descartar un viewController, el contentOffset de mi tableView se cambió a (0, -64).

mi solución fue un poco extraña, probé todas las otras respuestas pero no tuve éxito, lo único que solucionó mi problema fue cambiar la posición tableView en el árbol de controles del .xib

fue el primer control en la Vista principal como este:

antes de

Moví el tableView justo después del ImageView y funcionó:

después

parece que poner la vista de la mesa en la primera posición estaba causando el problema, y ​​mover la vista de la mesa a otra posición solucionó el problema.

PD No estoy usando autoLayout ni guiones gráficos

¡Espero que esto pueda ayudar a alguién!

Chuy47
fuente
¡Noté lo mismo! No pongo vistas adicionales, pero simplemente compenso la brecha moviendo la parte superior de UITableView -44. En IB, parece que tengo que mover -64px, pero en tiempo de ejecución -64px porque tablview superpone la barra de navegación y -44px está bien. No puedo explicarlo del todo. Encontré este problema en la vista emergente del iPad, cuando no noté ningún problema similar en el guión gráfico del iPhone.
Mike Keskinov
Este problema surge incluso con la vista de usuario. si las vistas que se muestran en la interfaz de usuario no se colocan en el mismo orden.
Rinku
2
Tuve el mismo problema hoy, con XCode 6.1. Tiza otras 2-3 horas desperdiciadas, tratando de solucionar los errores de Apple ...
Mike Gledhill
3
¡Esto fue extremadamente útil y merece más atención! No me ayudó mucho jugar con la configuración del controlador de vista o la inserción / desplazamiento de contenido, pero cambiar el orden de las vistas en el guión gráfico resolvió el problema para mí.
Caleb
1
Apple, quiero decir ... ¿WTF? Gracias, esto también solucionó el guión gráfico con diseño automático.
Borzh
30

resuelve mi problema similar:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}
Alex
fuente
1
Debe verificar la versión del sistema de esta manera:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes
Esto funcionó para mí para el problema de espaciado que estaba teniendo, pero ahora mi control giratorio de extracción para actualizar aparece parcialmente oscurecido y debajo de mi menú superior. ¿Alguien ha visto esto también? ¿Alguna solución?
Nick
@ nickv2002 intente crear tableView programáticamente
Alex
Probé
13

Intenta usar esto

tableView.separatorInset = UIEdgeInsetsZero;

Obviamente, si admite algo menos que iOS7, deberá asegurarse de que el objeto responda a este selector antes de llamarlo.

David Attaie
fuente
4
no estoy seguro de por qué se vota hacia arriba ... separatorInset solo cambia las líneas de distancia entre las celdas que se insertan desde el borde de la vista. La pregunta es sobre el espacio encima y debajo de las celdas
Rembrandt Q. Einstein
La imagen es engañosa, pero una búsqueda común en Google del problema del margen da como resultado esta página.
Will el
9

En serio, cambiar contentOffsetno es la solución. Solo está solucionando un problema y no la causa. He estado enfrentando el mismo problema y resulta que los tableViews agrupados tienen un relleno en la parte superior. En mi caso, estableciendo el tipo en simple ha funcionado.

Ojalá le ahorre a alguien unos minutos. Z.

Zoltán
fuente
1
Me lo perdí por completo, me alegro de haber encontrado tu respuesta, UPVOTE
AamirR
8

Con iOS 9, ninguna de las otras respuestas de esta página funcionó para mí (es decir, desmarcar casillas en Storyboard, configurar automaticallyAdjustsScrollViewInsetsenNO ).

Mi solución alternativa con la que estoy realmente insatisfecho fue esta:

- (void)viewDidAppear:(BOOL)animated {
    self.tableView.contentOffset = CGPointMake(0.0, 0.0);
    self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

Las mismas líneas en viewWillAppearo viewDidLoadfueron ineficaces.

Henry el sucio
fuente
Esta debería ser la única respuesta para uitableviewcontroller iOS 9 ... realmente, nada más ayudó, y los he probado todos, ¿dónde encontraste esto o cómo lo descubriste? muchos 10x
Erez
Desmarcar la Adjust Scroll View insetscasilla de verificación funciona para iOS 9.
Adam
¿Ajustar las inserciones de la vista de desplazamiento no me funcionan con alguna otra solución?
Yogesh Patel
5

A veces, obtengo un 64espacio de altura en la parte superior de mi vista de tabla cuando UIViewControllerestá incrustado dentro de un controlador de navegación.

ingrese la descripción de la imagen aquí

En el pasado, simplemente recreaba todo, con la esperanza de que las restricciones resultaran correctas después de una pizarra limpia.

TIL: Si no desea hacer una restricción vertical al Top Layout Guide, puede mantener presionada la Optiontecla para acceder al Container Margin.

ingrese la descripción de la imagen aquí

Luego asegúrese de que la Top Space to Superviewconstante esté establecida en 0. Esto funcionó para mí al menos.

ingrese la descripción de la imagen aquí

Robert Chen
fuente
1,5 años después, pero eso resolvió mi velada. ¡Gracias!
asp_net
4

Esto funciona para mí:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
sídixon
fuente
2

Si agrega una UIView vacía antes de UITableView (o cualquier vista es desplazable como ScrollView y TextView), puede tener suerte.

Castor
fuente
1

Tenía un UITableViewController incrustado en una vista de contenedor. Para deshacerme de los 64 puntos no deseados de espacio vertical, necesitaba desmarcar 'Ajustar inserciones de vista de desplazamiento' en Interface Builder y establecer contentInset de UITableView en viewWillAppear de mi UITableViewController como se muestra a continuación.

El tamaño del espacio vertical parece coincidir con la altura del marco de la barra de navegación y el desplazamiento y. El problema solo ocurrió en iOS 7.

- (void)viewWillAppear:(BOOL)animated;
{
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        const CGRect navBarFrame = self.navigationController.navigationBar.frame;
        const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
        self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
    }
}
usuario2067021
fuente
1

En Xamarin iOS, tuve este problema en un UITableViewController en segundo plano justo después de que se descartara el cuadro de diálogo modal en primer plano. En el proceso de pasar al primer plano, UITableViewController tenía inserciones configuradas (en algún lugar por iOS):

Esta clase lo resolvió

public class UITableViewControllerWithBugFix : UITableViewController {
    public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
    }

    public override void ViewWillLayoutSubviews() {
        if (TableView.ContentInset.Top != 0.0f)
            TableView.ContentInset = UIEdgeInsets.Zero;
        if (TableView.ScrollIndicatorInsets.Top != 0.0f)
            TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;

        base.ViewWillLayoutSubviews();
    }
}
Herman Schoenfeld
fuente
1

De vez en cuando vuelvo a esta terrible situación y me doy cuenta de que todavía es bastante desconocida. Entonces, para la memoria futura ...

Últimamente, me estoy arreglando con esta solución.

  1. Agregue una subvista en la parte superior de UITableView, con una altura de píxel cero. Funciona con Autolayout o sin él.
  2. Si me siento seguro :-) elimino esta vista falsa, soluciono las restricciones en la parte superior y mágicamente funciona.

No me preguntes por qué, sigo pensando que hay un error en UIKit.

Klauslanza
fuente
0

Si va al guión gráfico, puede cambiar el desplazamiento seleccionando la tabla y, en la sección Vista de tabla en el inspector de atributos, simplemente cambie las Inserciones del separador a la izquierda a 0.

Nyctitropist
fuente
0

Creo que la solución real es configurar sus restricciones superior e inferior en la vista de tabla para que sean iguales a topMargin y bottomMargin. No es la guía de diseño superior ni la guía de diseño inferior. Esto le permite mantener automáticamenteAdjustsScrollViewInsets como verdaderos.

Dan
fuente
0

Solución Swift 3:

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}
hhamm
fuente
0

Si se incrustó su TableViewController en un NavigationController o una ContainerView, You have to constraint to margins instead of top Layout guide in Storyboard. Check constraint to margins when you are doing the constraintsNinguna otra forma funcionó para mí. No pude comentar, así que solo estoy reiterando la respuesta de Robert Chens.

user3296487
fuente
0

Probé varias de las respuestas. Cambiar la configuración en el guión gráfico provocó problemas de ondulación con un menú superpuesto que aparece desde la izquierda.

Solo tengo un UIViewController en blanco en el guión gráfico, de lo contrario, todo se genera mediante programación.

Tengo el mismo problema con un UITableView dentro de un UIView dentro de un UIViewController. Es decir, los encabezados de sección comienzan demasiado abajo cuando el UIViewController está incrustado en un controlador de navegación. Sin el controlador de navegación, todo funciona bien.

Para solucionar el problema, creé un UILabel y con restricciones coloqué la restricción inferior de UILabel = la restricción superior de UIView (por lo que no se muestra en la pantalla. Ahora, con ese control adicional (la nueva etiqueta), TableView se comporta correctamente.

    inputsContainerView.addSubview(titleLabel)
    inputsContainerView.addSubview(tableView)

    // inputsContainerView
    ///////////////////////////////////////
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
    inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true

    // tableView
    ///////////////////////////////////////
    tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true

    // titleLabel - inserted to stop bad section header behavior
    ///////////////////////////////////////
    titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
Juan
fuente
0

Tuve el mismo problema en iOS 11 y xib, UITableviewController y lo resolví de la siguiente manera

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
dobiho
fuente