UITableView comienza con un desplazamiento en iOS 7
ios7 (20)
A veces, obtengo un intervalo de 64
altura en la parte superior de mi vista de tabla cuando el UIViewController
está incrustado dentro de un controlador de navegación.
En el pasado, simplemente volvía a crear todo, con la esperanza de que las restricciones resultaran correctas después de una borrón y cuenta nueva.
TIL: si no desea aplicar una restricción vertical a la Top Layout Guide
, puede mantener presionada la tecla Option
para acceder al Container Margin
.
Luego, asegúrese de que la constante Top Space to Superview
esté configurada en 0
. Esto funcionó para mí al menos.
He arrastrado un simple UITableView jane en 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 donde realmente comienza UITableView. No pregunté por la compensación grande ¿verdad?
¿Algunas ideas?
Con iOS 9, ninguna de las otras respuestas de esta página funcionó para mí (es decir, desmarcar cuadros en Storyboard, estableciendo automaticallyAdjustsScrollViewInsets
NO
en NO
).
Mi solución sobre la que estoy realmente insatisfecho fue esto:
- (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 viewWillAppear
o viewDidLoad
fueron efectivas.
Creo que la verdadera solución es configurar sus restricciones superiores e inferiores en la vista de tabla sea igual a la Margen superior y la Margen inferior. No es la guía de diseño superior y la guía de diseño inferior. Esto le permite mantener automáticamente AdjustsScrollViewInsets como verdadero.
De forma predeterminada, los controladores de vista de tabla rellenarán el contenido debajo de la barra de navegación para poder desplazar el contenido debajo de él y verlo, en un estado borroso, debajo de la barra de navegación / barra de herramientas.
Parece que lo estás colocando a 44 (tal vez 64) px para moverlo desde debajo de la barra de navegación, pero ya compensa esto, así que obtienes un gran espacio.
Vaya al guión gráfico / xib en IB y desmarque el contenido del programa debajo de la barra de navegación.
De vez en cuando vuelvo a esta horrible situación y noto que todavía es bastante desconocida. Entonces, para la memoria futura ...
Últimamente, me estoy arreglando con esta solución.
- Agregue una subvista en la parte superior de UITableView, con altura de píxel cero. Funciona con Autolayout o sin él.
- Si me siento seguro :-) elimino esta vista falsa, corrijo las restricciones en la parte superior y mágicamente funciona.
No me preguntes por qué, todavía creo que es un error profundo en UIKit.
En Xamarin iOS, tuve este problema en un UITableViewController retrocedido justo después de que se descartara el diálogo modal en primer plano. En el proceso de pasar al primer plano, el UITableViewController tenía un conjunto de inserciones (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();
}
}
En serio, cambiar contentOffset
no es la solución. Estás solucionando un problema y no arreglando la causa. He estado enfrentando el mismo problema y resulta que las TableView agrupadas tienen un relleno en la parte superior. En mi caso, establecer el tipo a simple ha hecho el truco.
Con suerte, le ahorra a alguien unos minutos. Z.
Esto funciona para mí:
- (void)loadView
{
[super loadView];
[self setAutomaticallyAdjustsScrollViewInsets:YES];
self.edgesForExtendedLayout = UIRectEdgeNone;
self.view.frame = CGRectZero;
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
Intenté varias de las respuestas. Cambiar la configuración en el guión gráfico provocó problemas de ondulación con un menú de superposición que aparece desde la izquierda.
Solo tengo un UIViewController en blanco en el guión gráfico; de lo contrario, todo se genera programáticamente.
Tengo el mismo problema con una UITableView dentro de una UIView dentro de un UIViewController. A saber, 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é UILabel bottom constraint = la restricción superior de UIView (para que no se muestre en la pantalla. Ahora con ese control adicional (la nueva etiqueta) el 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
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.
La nueva implementación de iOS 7 de UIViewController tiene un nuevo conjunto de opciones que le permite al desarrollador elegir si el sistema agregará inserciones automáticamente para UIScrollView , UITableView y derivaciones.
Para desactivar este comportamiento, desmarque estos cuadros para todos sus UIViewControllers en InterfaceBuilder, en el inspector de objetos seleccionado UIViewController :
Para más detalles:
Si agrega un UIView vacío antes de UITableView (o cualquier vista es desplazable, como ScrollView y TextView), puede tener suerte.
Si incrustó TableViewController en NavigationController o ContainerView, You have to constraint to margins instead of top Layout guide in Storyboard
. Check constraint to margins when you are doing the constraints
No me funcionó de otra manera. No pude comentar, así que solo estoy reiterando la respuesta de Robert Chens.
Si va al guión gráfico, puede cambiar el desfase seleccionando la tabla y, en la sección Vista de tabla en el inspector de atributos, simplemente cambiará a 0 las inserciones del separador de la izquierda.
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
}
}
Tenía un UITableViewController incrustado en una vista de contenedor. Para deshacerse de los 64 puntos no deseados del espacio vertical, tuve que desmarcar el ''Ajuste de las configuraciones de la vista de desplazamiento'' en Interface Builder y establecer el contentInset de UITableView en la vista de UITableViewControllerWillAppear como 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);
}
}
Tuve el mismo problema en iOS 11 y xib, UITableviewController y lo resolví a continuación.
[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
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 de .xib
fue el primer control en la Vista padre como este:
Moví el TableView justo después de ImageView y funcionó:
parece que poner la vista de tabla en la primera posición estaba causando el problema, y mover la vista de tabla a otra posición solucionó el problema.
PD No estoy usando autoLayout ni guiones gráficos
¡Espero que esto pueda ayudar a alguién!
resuelve mi problema similar:
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}
De la guía de transición iOS7:
Si no desea que las inserciones de contenido de una vista de desplazamiento se ajusten automáticamente, configure automáticamente AjustaScrollViewInsets a NO. (El valor predeterminado de automaticallyAdjustsScrollViewInsets es SÍ).
self.automaticallyAdjustsScrollViewInsets = NO;