iOS 8.0 presenta 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.
La solución fácil es subclasificar su celda y anular la propiedad de los márgenes de diseño como lo sugiere @ user3570727. Sin embargo, perderá cualquier comportamiento del sistema, como heredar márgenes del Área segura, por lo que no recomiendo la siguiente solución:
(C objetivo)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}
(rápido 4.2):
override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }
Si no desea anular la propiedad, o necesita establecerla condicionalmente, siga leyendo.
Además de la layoutMargins
propiedad, Apple ha agregado una propiedad a su celda que evitará que herede la configuración de margen de la Vista de tabla. Cuando se establece esta propiedad, sus celdas pueden configurar sus propios márgenes independientemente de la vista de tabla. Piense en ello como una anulación.
Se llama a esta propiedad preservesSuperviewLayoutMargins
y establecerla en NO
permitirá que la layoutMargin
configuración de la celda anule lo que layoutMargin
esté configurado en su TableView. Ambos ahorran tiempo ( no tiene que modificar la configuración de la Vista de tabla ) y son más concisos. Consulte la respuesta de Mike Abdullah para obtener una explicación detallada.
NOTA: lo que sigue es una implementación limpia para una configuración de margen a nivel de celda , como se expresa en la respuesta de Mike Abdullah. La configuración de su celda preservesSuperviewLayoutMargins=NO
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.
Configure los márgenes de su 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:
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
}
}
Establecer la preservesSuperviewLayoutMargins
propiedad en su celda en NO debería evitar que su vista de tabla anule los márgenes de su celda. En algunos casos, parece no funcionar correctamente.
Si todo falla, puede aplicar fuerza bruta a los márgenes de 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:
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í lo tienes! Esto debería funcionar en iOS 7 y 8.
EDITAR: Mohamed Saleh me llamó la atención sobre un posible cambio en iOS 9. Es posible que deba configurar la Vista de tabla cellLayoutMarginsFollowReadableWidth
enNO
si desea personalizar inserciones o márgenes. Su kilometraje puede variar, esto no está muy bien documentado.
Esta propiedad solo existe en iOS 9, así que asegúrese de verificar antes de configurar.
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Swift 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(el código anterior del separador 0 UITableView del separador UITableView 0 no funciona )
EDITAR: Aquí hay un enfoque puro de Interface Builder:
NOTA: iOS 11 cambia y simplifica gran parte de este comportamiento, se lanzará una actualización ...