iOS 8 UITableView: si tiene celdas con layout personalizado, probablemente también tenga este problema

En iOS 8, para dispositivos más grandes, el recuadro pnetworkingeterminado de tableView parece cambiar. Si está distribuyendo celdas personalizadas y haciendo coincidir su restricción de layout izquierdo con la inserción de tamaño 15 pnetworkingeterminada para una celda, su layout se verá bien en dispositivos más pequeños, pero en dispositivos más grandes donde la inserción cambia, obtendrá algo similar a lo siguiente :


TableViewCell separator inset alignement


¿Cómo puedo arreglar esto?

No hay ninguna opción / propiedad en Xcode6 para solucionarlo. Hay un método setter setSepratorInset que establece el valor de inserción. Pero no podemos pasar (-ve) valor a <#CGFloat left#> para iniciarlo desde la izquierda. Como su valor mínimo es siempre 0.

 [tableView setSeparatorInset:UIEdgeInsetsMake(<#CGFloat top#T, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)]; 

Si desea resolverlo, oculte la línea de separación y agregue una image de 1px con el ancho deseado para crear una línea y agregarla a la celda y que también se verá igual en todos los dispositivos.

Se las arregló para escribir algo que parece funcionar bien. Si hay una solución más bonita, comparta.

 @interface InsetRespectingTableViewCell() @property (nonatomic) IBOutlet NSLayoutConstraint * leftContentInset; @property (nonatomic) IBOutlet NSLayoutConstraint * rightContentInset; @end @implementation InsetRespectingTableViewCell - (UITableView *)tableView { UIView *view; for (view = self.superview; ![view isKindOfClass:UITableView.class] && view; view = view.superview); return (UITableView *)view; } - (void)updateInset { CGFloat defaultInset = [self tableView].separatorInset.left; self.leftContentInset.constant = defaultInset; self.rightContentInset.constant = defaultInset; } - (void)didMoveToSuperview { [super didMoveToSuperview]; [self updateInset]; } 

Pude usar limitaciones de tamaño para que coincida con la apariencia en todo, excepto en el iPhone 6+, siempre que me quedé con iOS 8. La corrección del aspecto en iOS 8 lo rompió en iOS 7. El enfoque básico que utilicé fue establecer el limita de forma diferente para "Ancho regular | Cualquier altura" y usa inserciones de 13 px en lugar de 7 px:

  1. Diseña tu vista usando el layout automático con +/- 7 px de espacio en el súper contenedor.
  2. Seleccione la restricción de layout de la list de la izquierda
  3. En el editor de properties en el extremo derecho, click (+) al lado de constante y select "Ancho normal | Cualquier altura" del menu emergente. Eso agregará una nueva línea bajo Constant.
  4. Cambia el valor de 7 a 13.

No es una solución completa, pero es un comienzo.

Nota: si necesita agregar una línea de píxel verdadera , no engañe con una image, use esto:

 @interface UILine : UIView @end @implementation UILine -(void)awakeFromNib { float sortaPixel = 1.0/[UIScreen mainScreen].scale; // float sortaPixel = 1.0/self.contentScaleFactor; // -- recall, that does NOT work when loading from storyboard! UIView *line = [[UIView alloc] initWithFrame: CGRectMake(0, 0, self.frame.size.width, sortaPixel)]; line.userInteractionEnabled = NO; line.backgroundColor = self.backgroundColor; line.autoresizingMask = UIViewAutoresizingFlexibleWidth; [self addSubview:line]; self.backgroundColor = [UIColor clearColor]; self.userInteractionEnabled = NO; } @end 

Cómo usar en storyboard, simplemente haz una UIView que esté en el lugar exacto y el ancho exacto que quieras. (Naturalmente, haz que se extienda a lo ancho, o lo que sea necesario.)

Simplemente haga la vista, digamos, 5 pr 6 píxeles de alto, simplemente para que pueda verla correctamente. (No importa qué tan alto lo hagas en el guión gráfico.)

(Haz que la parte superior de la UIView exacto donde quieras la línea de un solo píxel).

Haz que UIView tenga el color que quieras, probablemente negro.

Cambie la class a UILine. En time de ejecución dibujará una línea perfecta de un solo píxel en la location exacta en todos los dispositivos.

Espero que ayude con esto de una manera pequeña.

Es muy interesante.

En el proyecto creado por Xcode5, el recuadro izquierdo del separador es 15/15/16 (iPhone5s / iPhone6 ​​/ iPhone6P).

Y en el proyecto creado por Xcode6 es 16/16/20 (iPhone5s / iPhone6 ​​/ iPhone6P).

En mi caso, deshabilito el separador pnetworkingeterminado en tableView e hice una baseCell para volver a dibujar la línea separadora.

enlace: https://github.com/jshl8612/UTableViewBaseCell

Espero que ayude un poco.

Aquí hay una idea de cómo se puede arreglar.

 @IBOutlet weak var leftViewLeadingConstraint: NSLayoutConstraint! override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() switch UIScreen.mainScreen().scale { case 2: leftViewLeadingConstraint.constant = 7.0 case 3: leftViewLeadingConstraint.constant = 11.0 default: assertionFailure("Error: wrong scale value") } } 

En su celda personalizada, puede anular layoutSubviews y especificar el recuadro que desee.

Desde: https://developer.apple.com/library/IOs/documentation/UIKit/Reference/UIView_Class/index.html#//apple_ref/occ/instm/UIView/layoutSubviews

"Debe anular este método solo si los comportamientos de autorescript y de restricción de las subvistas no ofrecen el comportamiento que desea"