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 layoutMargins
proprietà, 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 preservesSuperviewLayoutMargins
e impostandola su NO
consentirà alle layoutMargin
impostazioni della cella di sovrascrivere qualsiasi cosa layoutMargin
sia 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=NO
garantirà 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 preservesSuperviewLayoutMargins
proprietà 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 cellLayoutMarginsFollowReadableWidth
suNO
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 ...