iOS 8 UITableView separator insert 0 no funciona

Este artículo fue traducido de: iOS 8 UITableView separador inserto 0 no funciona

La DONDE una aplicación que tiene el I UITableView'S se establece en la inserción de los valores separador personalizado - Derecha 0, Izquierda 0. Tengo una aplicación en la que UITableViewel separador se inserta en un valor de encargo - la derecha 0y la izquierda 0. Esto funciona perfectamente iOS 7.x, sin embargo iOS 8.0, veo que el recuadro del separador está establecido en el valor predeterminado de 15la derecha. Esto funciona iOS 7.xperfectamente, pero antes de iOS 8.0ver el separador insertado en el lado derecho está establecido en el valor predeterminado 15. Aunque en los archivos xib que configuró 0, todavía se muestra incorrectamente. Aunque está configurado en el archivo xib 0, todavía se muestra incorrectamente.

El quitar el que hago en el Cómo UITableViewCellmárgenes separador? ¿Cómo suprimir UITableViewCelldelimitador márgenes?


Piso # 1

Referencia: https://stackoom.com/question/1k7z5/iOS-UITableView separador-inserción no funciona


# 2F

¡Arg! ¡ Arginina! Después de jugar o hacer esto en su Cellsubclase: Después de realizar esta operación en su subclase :Cell

- (UIEdgeInsets)layoutMargins
{
    return UIEdgeInsetsZero;
}

o configurarlo cell.layoutMargins = UIEdgeInsetsZero; o cell.layoutMargins = UIEdgeInsetsZero; arreglarlo por mí .


Piso # 3

En Swift es un poco más molesto porque layoutMarginses una propiedad, por lo que debes anular al captador y al colocador. En Swift, es un poco molesto porque es una propiedad, por lo que debes anular al captador y al colocador.layoutMargins

override var layoutMargins: UIEdgeInsets {
  get { return UIEdgeInsetsZero }
  set(newVal) {}
}

Por Will Efectivamente, el hacer que el presente layoutMarginssólo lectura, que en mi caso está muy bien. Esto efectivamente hace que el layoutMarginsde sólo lectura, que en mi caso es bueno.


# 4F

Creen al mismo, El Éste es el yo que el que hizo la pregunta aquí Fondo: Remove SeparatorInset EN IOS XCode 6 8 UITableView para el simulador de iPhone creo que este es el problema que yo crecí aquí: Eliminar iOS SeparatorInset UITableView para XCode el 8 de 6 simulador de iPhone

En iOS 8 , hay una nueva propiedad para todos los objetos de los que se hereda UIView. En iOS 8 , UIViewtodos los objetos heredados de tienen una nueva propiedad. Por lo tanto, la solución para configurar SeparatorInseten iOS 7.x no podrá eliminar el espacio en blanco que ve en UITableView en iOS 8. Por lo tanto , la solución establecida en iOS 7.x no podrá eliminarlo en iOS 8. El área en blanco que se ve en UITableView.SeparatorInset

La nueva propiedad se llama " layoutMargins " y se llama " layoutMargins ".

@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

iOS 8 UITableView setSeparatorInset : UIEdgeInsetsZero setLayoutMargins : UIEdgeInsetsZero

La solución: -Solución : -

-(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];
   }
}

Si se establece cell.layoutMargins = UIEdgeInsetsZero; si se establece cell.layoutMargins = UIEdgeInsetsZero; el sin comprobar en el IF layoutMarginsexiste, en el App por Will accidente en iOS 7.x sin comprobar layoutMarginsla presencia de, la aplicación se bloquea en IOS 7.x Así pues, sea Comprobación de la mejor manera sería El SI layoutMarginsEXISTE En primer lugar antes setLayoutMargins:UIEdgeInsetsZero. Por lo tanto, el mejor enfoque es setLayoutMargins:UIEdgeInsetsZeroantes de comprobar layoutMarginsla presencia.


# 5F

iOS 8.0 introduce la propiedad layoutMargins en celdas Y vistas de tabla iOS 8.0 introduce la propiedad layoutMargins en celdas y vistas de tabla.

Esta propiedad no está disponible en iOS 7.0, por lo que debe asegurarse de verificar antes de asignarla. Esta propiedad no está disponible en iOS 7.0, por lo que debe asegurarse de verificar antes de asignarla .

La solución fácil es subclasificar su celda y anular la propiedad de márgenes de diseño como lo sugiere @ user3570727. La solución simple es subclasificar su celda y anular la propiedad de margen de diseño sugerida por @ user3570727 . Sin embargo, perderá cualquier comportamiento del sistema, como heredar los márgenes del Área segura, por lo que no recomiendo la siguiente solución: Sin embargo, perderá cualquier comportamiento del sistema, como heredar los márgenes del área segura, por lo que no recomiendo las siguientes soluciones:

(ObjectiveC) (的 ObjectiveC)

-(UIEdgeInsets)layoutMargins { 
     return UIEdgeInsetsZero // override any margins inc. safe area
}

(swift 4.2): (swift 4.2) :

override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }

Si no desea anular la propiedad, o necesita establecerla condicionalmente, siga leyendo. Si no desea anular la propiedad, o necesita establecerla condicionalmente , continúe leyendo.


Un Además de en la layoutMarginspropiedad, Apple ha añadido una propiedad a su la célula que por evitará que heredar los valores de margen de la vista de tabla. Además de layoutMarginslos bienes ajenos, Apple también agregó una para ti célula de propiedades, con el fin de evitar que se hereda su mesa Ver ajustes de margen. Cuando se establece esta propiedad, sus celdas pueden configurar sus propios márgenes independientemente de la vista de tabla. Después de establecer esta propiedad, sus celdas pueden configurar sus propios márgenes independientemente de la vista de tabla . Piense en ello como una anulación. Piense en ello como una anulación .

Propiedad se llama el presente preservesSuperviewLayoutMargins, ya que éste se ocultaba NOWill permitir la apos The Cell layoutMarginAjuste de la modificar el que layoutMarginse encuentra en su TableView. Esta propiedad se conoce preservesSuperviewLayoutMargins, y el conjunto NOpara permitir que la célula layoutMarginse proporciona ninguna cobertura proporcionada en el TableView layoutMargin. Ahorra tiempo tanto-IT ( usted no tiene que el modificar la tabla en la configuración de vista ), y es más conciso. Se ahorra tiempo ( que no tiene que modificar la configuración de la vista de tabla ), pero más concisa. Para obtener una explicación detallada, consulte la respuesta de Mike Abdullah . Para obtener instrucciones detalladas, consulte la respuesta de Mike Abdullah.

NOTA: Lo que sigue es un lugar limpio de Ejecución A -level cell MARGEN , como se expresa en Mike Abdullah apos respuesta. Nota: El siguiente es un ajuste de margen de nivel de celda para lograr sencilla, como la respuesta a Mike Abdullah. La configuración de su celda preservesSuperviewLayoutMargins=NOasegurará que su Vista de tabla no anule la configuración de la celda. La configuración de preservesSuperviewLayoutMargins=NO la celda asegurará que su vista de tabla no anule la configuración de la celda . Si realmente desea que toda su vista de tabla tenga márgenes consistentes, ajuste su código en consecuencia. Si realmente desea que toda su vista de tabla tenga márgenes consistentes, ajuste su código en consecuencia .

Configure sus márgenes de celda: establezca sus márgenes de celda:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Remove seperator inset
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
           [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    // Prevent the cell from inheriting the Table View's margin settings
    if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
        [cell setPreservesSuperviewLayoutMargins:NO];
    }

    // Explictly set your cell's layout margins
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

Swift 4: Swift 4:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    // Remove seperator inset
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = .zero
    }
    // Prevent the cell from inheriting the Table View's margin settings
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
    // Explictly set your cell's layout margins
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = .zero
    }
}

El el ajuste preservesSuperviewLayoutMarginsde propiedad NO ON a tu teléfono Debería Evitar que el Tabla anule sus márgenes celulares. Las células de la preservesSuperviewLayoutMarginspropiedad en NO debe ser impedido de cobertura de los márgenes celda Ver tabla. En algunos casos, parece no funcionar correctamente, en algunos casos parece no funcionar correctamente .

Si todo falla, puede aplicar fuerza bruta a los márgenes de la vista de tabla: Si todo falla, puede forzar los márgenes de la vista de tabla:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    // Force your tableview margins (this may be a bad idea)
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
} 

Swift 4: Swift 4:

func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // Force your tableview margins (this may be a bad idea)
    if tableView.responds(to: #selector(setter: UITableView.separatorInset)) {
        tableView.separatorInset = .zero
    }
    if tableView.responds(to: #selector(setter: UITableView.layoutMargins)) {
        tableView.layoutMargins = .zero
    }
}

... y ahí vas! ...... vas! Esto debería funcionar en iOS 7 y 8. Esto debería funcionar en iOS 7 y 8.


EDIT: Mohamed Saleh trajo a mi la atención de un posible cambio en IOS 9. mediante Es posible que necesite el SET en el la Tabla de cellLayoutMarginsFollowReadableWidtha NOSI desea personalizar las inserciones de o márgenes. Edición: Mohamed Saleh me llamó la atención a los cambios en IOS 9 puede ocurrir . Si desea insertar o márgenes personalizados, es posible que necesite Tabla de cellLayoutMarginsFollowReadableWidthdecir NO. Su millaje puede variar, esto no está documentado muy bien. Su millaje puede variar, pero no está documentado .

Esta propiedad solo existe en iOS 9, así que asegúrese de verificarla antes de configurarla. Esta propiedad solo existe en iOS 9, así que asegúrese de verificarla antes de configurarla .

if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
    myTableView.cellLayoutMarginsFollowReadableWidth = NO;
} 

Swift 4: Swift 4:

if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
    myTableView.cellLayoutMarginsFollowReadableWidth = false
}

(Por encima de código de iOS 8 UITableView la inserción de 0 no funcionan Separador ) (desde el código de seguridad de inserción separador iOS 8 UITableView ineficaz 0 )

EDITAR: Aquí hay un enfoque puro de Interface Builder: EDITAR: Este es un enfoque puro de Interface Builder:

TableViewAttributesInspector TableViewCellSizeInspector

NOTA: iOS 11 cambia y simplifica gran parte de este comportamiento, se lanzará una actualización ... Nota: iOS 11 cambia y simplifica la mayoría de este comportamiento, y pronto se lanzará una actualización ...


Piso # 6

En cuanto a lo que sugirió cdstamper en lugar de la vista de tabla, me resulta útil agregar las líneas siguientes en el método layoutSubview de la celda.

- (void)layoutSubviews 
{
    [super layoutSubviews];

    if ([self respondsToSelector:@selector(setSeparatorInset:)])
                [self setSeparatorInset:UIEdgeInsetsZero];

        if ([self respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)])
        {
            [self setPreservesSuperviewLayoutMargins:NO];;
        }

        if ([self respondsToSelector:@selector(setLayoutMargins:)]) 
        {
            [self setLayoutMargins:UIEdgeInsetsZero];
        }
}
Publicado 0 artículos originales · elogiado 8 · 30,000+ visitas

Supongo que te gusta

Origin blog.csdn.net/asdfgh0077/article/details/105537551
Recomendado
Clasificación