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 UITableView
el separador se inserta en un valor de encargo - la derecha 0
y 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 15
la derecha. Esto funciona iOS 7.x
perfectamente, pero antes de iOS 8.0
ver 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 UITableViewCell
márgenes separador? ¿Cómo suprimir UITableViewCell
delimitador 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 Cell
subclase: 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 layoutMargins
es 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 layoutMargins
sólo lectura, que en mi caso está muy bien. Esto efectivamente hace que el layoutMargins
de 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 , UIView
todos los objetos heredados de tienen una nueva propiedad. Por lo tanto, la solución para configurar SeparatorInset
en 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
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 layoutMargins
existe, en el App por Will accidente en iOS 7.x sin comprobar layoutMargins
la presencia de, la aplicación se bloquea en IOS 7.x Así pues, sea Comprobación de la mejor manera sería El SI layoutMargins
EXISTE En primer lugar antes setLayoutMargins:UIEdgeInsetsZero
. Por lo tanto, el mejor enfoque es setLayoutMargins:UIEdgeInsetsZero
antes de comprobar layoutMargins
la 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 layoutMargins
propiedad, 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 layoutMargins
los 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 NO
Will permitir la apos The Cell layoutMargin
Ajuste de la modificar el que layoutMargin
se encuentra en su TableView. Esta propiedad se conoce preservesSuperviewLayoutMargins
, y el conjunto NO
para permitir que la célula layoutMargin
se 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=NO
asegurará 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 preservesSuperviewLayoutMargins
de propiedad NO ON a tu teléfono Debería Evitar que el Tabla anule sus márgenes celulares. Las células de la preservesSuperviewLayoutMargins
propiedad 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 cellLayoutMarginsFollowReadableWidth
a NO
SI 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 cellLayoutMarginsFollowReadableWidth
decir 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:
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];
}
}