iOS 8.0 führt die Eigenschaft layoutMargins für Zellen- UND Tabellenansichten ein.
Diese Eigenschaft ist unter iOS 7.0 nicht verfügbar. Sie müssen sie daher überprüfen, bevor Sie sie zuweisen.
Die einfache Lösung besteht darin, Ihre Zelle in Unterklassen zu unterteilen und die Layoutränder-Eigenschaft zu überschreiben, wie von @ user3570727 vorgeschlagen. Sie verlieren jedoch jegliches Systemverhalten wie das Erben von Rändern aus dem sicheren Bereich. Daher empfehle ich die folgende Lösung nicht:
(Ziel c)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}
(schnell 4.2):
override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }
Wenn Sie die Eigenschaft nicht überschreiben möchten oder bedingt festlegen müssen, lesen Sie weiter.
Zusätzlich zu dieser layoutMargins
Eigenschaft hat Apple Ihrer Zelle eine Eigenschaft hinzugefügt , die verhindert, dass die Randeinstellungen Ihrer Tabellenansicht übernommen werden. Wenn diese Eigenschaft festgelegt ist, können Ihre Zellen unabhängig von der Tabellenansicht ihre eigenen Ränder konfigurieren. Betrachten Sie es als Überschreibung.
Diese Eigenschaft wird aufgerufen preservesSuperviewLayoutMargins
, und wenn Sie sie auf festlegen, NO
kann die layoutMargin
Einstellung der Zelle alle layoutMargin
in Ihrer TableView festgelegten Einstellungen überschreiben . Beides spart Zeit ( Sie müssen die Einstellungen der Tabellenansicht nicht ändern ) und ist präziser. Eine ausführliche Erklärung finden Sie in der Antwort von Mike Abdullah.
HINWEIS: Was folgt, ist eine saubere Implementierung für eine Randeinstellung auf Zellebene , wie in der Antwort von Mike Abdullah ausgedrückt. Durch das Festlegen Ihrer Zellen preservesSuperviewLayoutMargins=NO
wird sichergestellt, dass Ihre Tabellenansicht die Zelleneinstellungen nicht überschreibt. Wenn Sie tatsächlich möchten, dass Ihre gesamte Tabellenansicht konsistente Ränder aufweist, passen Sie Ihren Code entsprechend an.
Richten Sie Ihre Zellränder ein:
-(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
}
}
Wenn Sie die preservesSuperviewLayoutMargins
Eigenschaft für Ihre Zelle auf NEIN setzen, sollte verhindert werden, dass Ihre Tabellenansicht Ihre Zellenränder überschreibt. In einigen Fällen scheint es nicht richtig zu funktionieren.
Wenn alles fehlschlägt, können Sie Ihre Tabellenansichtsränder brutal erzwingen:
-(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
}
}
... und los geht's! Dies sollte unter iOS 7 und 8 funktionieren.
BEARBEITEN: Mohamed Saleh machte mich auf eine mögliche Änderung in iOS 9 aufmerksam. Möglicherweise müssen Sie die Tabellenansichten auf einstellen cellLayoutMarginsFollowReadableWidth
, NO
wenn Sie Einfügungen oder Ränder anpassen möchten. Ihr Kilometerstand kann variieren, dies ist nicht sehr gut dokumentiert.
Diese Eigenschaft ist nur in iOS 9 vorhanden. Überprüfen Sie sie daher unbedingt, bevor Sie sie einstellen.
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Swift 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(über Code von iOS 8 UITableView Separator Inset 0 funktioniert nicht )
EDIT: Hier ist ein reiner Interface Builder-Ansatz:
HINWEIS: iOS 11 ändert und vereinfacht einen Großteil dieses Verhaltens. Ein Update wird in Kürze veröffentlicht.