Eliminar SeparatorInset en iOS 8 UITableView para Xcode 6 iPhone Simulator
ios8 xcode6 (15)
Agregue imágenes de inicio para iPhone 6 y Plus. Antes de agregar las imágenes, el teléfono se está ejecutando en modo de escala, es decir, las aplicaciones más antiguas se escalan para adaptarse a los nuevos tamaños de pantalla. Esto puede estar causando las líneas. Las nuevas imágenes son Retina HD 5.5 (iPhone6Plus) 1242x2208 y Retina HD 4.7 (iPhone6) 750x1334.
Encontré un espacio en blanco extraño en
UITableView
para
iPhone 6 Simulator
(iOS 8) en Xcode 6 GM.
Intenté configurar
SeparatorInset
desde el guión gráfico y también el código, pero el espacio en blanco es hasta allí.
El siguiente código funciona en iOS 7 pero no en iOS 8 (simulador de iPhone 6).
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
}
Adjunto captura de pantalla a continuación:
Estoy usando AutoLayout por cierto.
Espero que alguien pueda mostrarme una forma de eliminar el extraño espacio en blanco en
TableView
.
En iOS8, debe configurar el recuadro tanto en el nivel de fila como en el de tabla.
Nivel de fila en cellForRowAtIndexPath:
if ([cell respondsToSelector:@selector(preservesSuperviewLayoutMargins)]){
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = false;
}
Nivel de tabla en viewDidLoad:
[tableReference setSeparatorInset:UIEdgeInsetsZero];
Después de eso, es una buena idea LIMPIAR su proyecto. En algunas ocasiones, noté que estos cambios no se introdujeron directamente en la aplicación ejecutable en el simulador.
En mi caso en Xcode 6.2, además de la respuesta de Will Q, tengo que ir a Main.storyboard> seleccionar UITableViewCell> Attributes Inspector. Cambie la lista desplegable Separador de Inserciones predeterminadas a Inserciones personalizadas . Cambie el recuadro izquierdo de 15 a 0.
Gracias Estudiante por señalarme en la dirección correcta con el comentario " Pruebe esto self.myTableView.layoutMargins = UIEdgeInsetsZero ;" Esta línea de código solo funcionará en iOS 8 porque layoutMargins solo está disponible desde iOS 8. Si ejecuto el mismo código en iOS 7, se bloqueará.
@property(nonatomic) UIEdgeInsets layoutMargins Description The default spacing to use when laying out content in the view. Availability iOS (8.0 and later) Declared In UIView.h Reference UIView Class Reference
A continuación se muestra la respuesta correcta para resolver este extraño espacio en blanco configurando los
tableview layoutMargins
y los
tableview layoutMargins
cell layoutMargins
como
UIEdgeInsetsZero
si existe (para iOS 8).
Y tampoco se bloqueará en iOS 7.
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[tableView setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Vea la captura de pantalla a continuación:-
IOS8 presenta un nuevo concepto llamado
Configuración de márgenes de contenido
, también se presenta una nueva propiedad llamada
layoutMargins
, para obtener detalles de la propiedad, consulte el documento de Apple.
El tipo de
layoutMargins
es
UIEdgeInsets
, por defecto el valor es {8,8,8,8}.
Para eliminar la línea de separación de TableView en IOS8, además de establecer
tableView.seperatorInset = UIEdgeInsetsZero
, también debe hacer lo siguiente:
Primero defina la macro
#define isIOS8SystemVersion (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)
En el método UITableViewDelegate agregue:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *reuseId = @"cellReuseID" ;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId];
if(!cell){
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseId];
if(isIOS8SystemVersion){
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins =NO ;
}
}
Hacer esto eliminará la línea de separación. También puede hacer lo siguiente:
UITableView *tableView = [[UITableView alloc] init];
if(isIOS8SystemVersion){
tableView.layoutMargins = UIEdgeInsetsZero ;
}
y en el método UITableViewDelegate agregue:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *reuseId = @"cellReuseID" ;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId];
if(!cell){
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseId];
if(isIOS8SystemVersion){
cell.layoutMargins = UIEdgeInsetsZero;
}
}
Intente crear una categoría de clase UITableViewCell y agregue este captador
- (UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero;
}
en iOS7 esto no se llamará porque no hay esta propiedad en SDK, y no causará ningún bloqueo ; en iOS8 se llamará cada vez que use la celda
Esto funciona para mi
Lo he intentado de muchas maneras, ninguna de ellas funciona, pero esta me funciona.
Mi solución con solo tres líneas de código:
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)row{
//
// ... your code ...
//
if ([cell respondsToSelector:@selector(preservesSuperviewLayoutMargins)]){
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = false;
}
return cell;
}
Para hacer que sus separadores UITableView separen a cero tanto para iOS7 como para iOS8, en lugar de realizar un cambio en el código, realice un cambio en el xib para UITableView cambiando View-> Mode-> Aspect Fill.
Si desea eliminar la línea blanca, pero mantener el separador insertado tal como está, simplemente configure cell.backgroundColor en tableView backgroundColor. Solo configurar cell.contentView.backgroundColor no hace que el problema desaparezca.
Solo agregue lo siguiente:
tableView.separatorStyle = .none
Solución para iOS 7 y iOS 8
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.separatorInset = UIEdgeInsetsMake(0.0f, cell.frame.size.width, 0.0f, 0.0f);
}
Tengo
UITableView
estático y quería cambiar el margen de un separador de celdas al borde izquierdo.
Gracias a las respuestas anteriores, esta fue mi solución
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
// needed to shift the margin a specific cell to the left edge
if indexPath.section == 3 && indexPath.row == 0 {
cell.layoutMargins = UIEdgeInsetsZero
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
}
}
Ver iOS 8 UITableView separador inserto 0 no funciona
Básicamente, debe establecer tanto el cell.layoutMargin como el layoutMargin de tableView. ¡YMMV, pero tuve que configurar la vista de tabla en layoutSubviews antes de que funcionara!
para iOS 8
intente estableciendo
cell.layoutMargins = UIEdgeInsetsZero;
en el método
cellForRowAtIndexPath