iOS 8.0 führt die layoutMargins-Eigenschaft für Zellen UND Tabellenansichten ein.
Diese Eigenschaft ist auf iOS 7.0 nicht verfügbar, also müssen Sie sicherstellen, dass Sie überprüfen, bevor Sie sie zuweisen!
Die einfache Lösung besteht darin, Ihre Zelle zu unterklassifizieren und die layoutMargins-Eigenschaft gemäß der Empfehlung von @user3570727 zu überschreiben. Sie verlieren jedoch jedes Systemverhalten wie das Erben von Rändern vom sicheren Bereich, also empfehle ich nicht die folgende Lösung:
(ObjectiveC)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // überschreibt alle Ränder inkl. sicherem Bereich
}
(swift 4.2):
override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }
Wenn Sie die Eigenschaft nicht überschreiben möchten oder sie bedingt setzen müssen, lesen Sie weiter.
Zusätzlich zur layoutMargins
-Eigenschaft hat Apple Ihrem Zelle eine Eigenschaft hinzugefügt, die verhindert, dass sie die Rand-Einstellungen Ihrer Tabellenansicht erbt. Wenn diese Eigenschaft gesetzt ist, können Ihre Zellen ihre eigenen Ränder unabhängig von der Tabellenansicht konfigurieren. Denken Sie daran wie eine Überschreibung.
Diese Eigenschaft nennt sich preservesSuperviewLayoutMargins
und das Setzen auf NO
ermöglicht es der Zelle, die layoutMargin
-Einstellung der Tabellenansicht zu überschreiben. Das spart Zeit (Sie müssen nicht die Einstellungen der Tabellenansicht ändern) und ist prägnanter. Bitte beachten Sie die Antwort von Mike Abdullah für eine detaillierte Erklärung.
HINWEIS: Im Folgenden finden Sie eine saubere Implementierung für eine Randen-Einstellung auf Zellebene, wie sie in der Antwort von Mike Abdullah beschrieben ist. Wenn Sie möchten, dass Ihre gesamte Tabellenansicht konsistente Ränder hat, passen Sie Ihren Code entsprechend an.
Richten Sie Ihre Zellenränder ein:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
// Trennlinieneinrückung entfernen
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
// Verhindern, dass die Zelle die Rand-Einstellungen der Tabellenansicht erbt
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
// Legen Sie explizit die Randmargen Ihrer Zelle fest
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// Trennlinieneinrückung entfernen
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = .zero
}
// Verhindern, dass die Zelle die Rand-Einstellungen der Tabellenansicht erbt
if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
// Legen Sie explizit die Randmargen Ihrer Zelle fest
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = .zero
}
}
Das Setzen der preservesSuperviewLayoutMargins
-Eigenschaft auf Ihrer Zelle auf NEIN sollte verhindern, dass Ihre Tabellenansicht Ihre Zellenränder überschreibt. In einigen Fällen scheint es jedoch nicht ordnungsgemäß zu funktionieren.
Wenn alles fehlschlägt, können Sie Ihre Tabellenansichtsränder gewaltsam ändern:
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
// Erzwingen der Tabellenansichtsränder (könnte eine schlechte Idee sein)
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()
// Erzwingen der Tabellenansichtsränder (könnte eine schlechte Idee sein)
if tableView.responds(to: #selector(setter: UITableView.separatorInset)) {
tableView.separatorInset = .zero
}
if tableView.responds(to: #selector(setter: UITableView.layoutMargins)) {
tableView.layoutMargins = .zero
}
}
...und da haben Sie es! Dies sollte auf iOS 7 und 8 funktionieren.
ÄNDERUNG: Mohamed Saleh hat mich auf eine mögliche Änderung in iOS 9 aufmerksam gemacht. Sie müssen möglicherweise die Eigenschaft der Tabellenansicht cellLayoutMarginsFollowReadableWidth
auf NO
setzen, wenn Sie Abstände oder Ränder anpassen möchten. Ihre Erfahrung kann variieren, da dies nicht sehr gut dokumentiert ist.
Diese Eigenschaft existiert nur in iOS 9, also stellen Sie sicher, dass Sie vor dem Setzen überprüfen.
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Swift 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(obiger Code von iOS 8 UITableView separator inset 0 not working)
ÄNDERUNG: Hier ist ein reiner Interface Builder-Ansatz:
HINWEIS: iOS 11 ändert und vereinfacht einen Großteil dieses Verhaltens, ein Update wird folgen...