iOS 8.0 introduce la proprietà layoutMargins su celle E viste tabella.
Questa proprietà non è disponibile su iOS 7.0, quindi devi assicurarti di controllare prima di assegnarla!
La soluzione semplice è sottoclassare la cella e sovrascrivere la proprietà dei margini del layout come suggerito da @ user3570727. Tuttavia, perderai qualsiasi comportamento del sistema come ereditare i margini dall'area sicura, quindi non consiglio la seguente soluzione:
(ObjectiveC)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}
(rapido 4.2):
override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }
Se non si desidera sovrascrivere la proprietà o è necessario impostarla in modo condizionale, continuare a leggere.
Oltre alla layoutMarginsproprietà, Apple ha aggiunto una proprietà alla tua cella che le impedirà di ereditare le impostazioni dei margini della vista tabella. Quando questa proprietà è impostata, le celle possono configurare i propri margini indipendentemente dalla vista tabella. Pensalo come una sostituzione.
Questa proprietà viene chiamata preservesSuperviewLayoutMarginse impostandola su NOconsentirà alle layoutMarginimpostazioni della cella di sovrascrivere qualsiasi cosa layoutMarginsia impostata su TableView. Entrambi risparmiano tempo ( non è necessario modificare le impostazioni della vista tabella ) ed è più conciso. Fare riferimento alla risposta di Mike Abdullah per una spiegazione dettagliata.
NOTA: ciò che segue è un'implementazione pulita per un'impostazione del margine a livello di cella , come espresso nella risposta di Mike Abdullah. L'impostazione delle celle preservesSuperviewLayoutMargins=NOgarantirà che la vista tabella non sovrascriva le impostazioni della cella. Se desideri che l'intera vista della tabella abbia margini coerenti, modifica il codice di conseguenza.
Imposta i margini delle celle:
-(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
}
}
L'impostazione della preservesSuperviewLayoutMarginsproprietà sulla cella su NO dovrebbe impedire alla vista tabella di ignorare i margini della cella. In alcuni casi, sembra non funzionare correttamente.
Se tutto fallisce, puoi forzare i tuoi margini di visualizzazione tabella:
-(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
}
}
... e eccoti qua! Questo dovrebbe funzionare su iOS 7 e 8.
EDIT: Mohamed Saleh ha portato alla mia attenzione un possibile cambiamento in iOS 9. Potrebbe essere necessario impostare la vista tabella cellLayoutMarginsFollowReadableWidthsuNO se si desidera personalizzare inserti o margini. Il tuo chilometraggio può variare, questo non è documentato molto bene.
Questa proprietà esiste solo in iOS 9, quindi assicurati di controllare prima di impostare.
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Swift 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(sopra il codice da iOS 8 UITableView separator inset 0 non funziona )
EDIT: ecco un puro approccio Interface Builder:

NOTA: iOS 11 modifica e semplifica gran parte di questo comportamento, sarà disponibile un aggiornamento ...