iOS 8.0 wprowadza właściwość layoutMargins do komórek ORAZ widoków tabeli.
Ta właściwość nie jest dostępna w systemie iOS 7.0, dlatego musisz ją sprawdzić przed przypisaniem!
Łatwym rozwiązaniem jest podklasowanie komórki i zastąpienie właściwości marginesów układu, zgodnie z sugestią @ user3570727. Utracisz jednak zachowanie systemu, takie jak dziedziczenie marginesów z obszaru bezpiecznego, więc nie polecam poniższego rozwiązania:
(Cel C)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}
(szybkie 4.2):
override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }
Jeśli nie chcesz przesłonić właściwości lub musisz ustawić ją warunkowo, czytaj dalej.
Oprócz tej layoutMargins
właściwości firma Apple dodała do komórki właściwość , która uniemożliwi dziedziczenie ustawień marginesów widoku tabeli. Po ustawieniu tej właściwości komórki mogą konfigurować własne marginesy niezależnie od widoku tabeli. Potraktuj to jako nadpisanie.
Ta właściwość jest wywoływana preservesSuperviewLayoutMargins
, a jej ustawienie NO
pozwoli na layoutMargin
zastąpienie ustawienia komórki tym, co layoutMargin
jest ustawione na TableView. Oba oszczędzają czas ( nie musisz modyfikować ustawień Widoku tabeli ) i są bardziej zwięzłe. Szczegółowe wyjaśnienie znajduje się w odpowiedzi Mike'a Abdullaha.
UWAGA: poniżej znajduje się czysta implementacja ustawienia marginesu na poziomie komórki , wyrażona w odpowiedzi Mike'a Abdullaha. Ustawienie komórki preservesSuperviewLayoutMargins=NO
zapewni, że widok tabeli nie zastąpi ustawień komórki. Jeśli chcesz, aby cały widok tabeli miał spójne marginesy, odpowiednio dostosuj kod.
Skonfiguruj marginesy komórkowe:
-(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
}
}
Ustawienie preservesSuperviewLayoutMargins
właściwości w komórce na NIE powinno uniemożliwić widok tabeli nadpisujący marginesy komórki. W niektórych przypadkach wydaje się, że nie działa poprawnie.
Jeśli wszystko zawiedzie, możesz brutalnie wymusić marginesy widoku tabeli:
-(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
}
}
... i proszę bardzo! To powinno działać na iOS 7 i 8.
EDIT: Mohamed Saleh zwrócił moją uwagę ewentualne zmiany w iOS 9. Być może trzeba ustawić Table View na cellLayoutMarginsFollowReadableWidth
celuNO
, jeśli chcesz dostosować wypustki lub marże. Twój przebieg może się różnić, nie jest to dobrze udokumentowane.
Ta właściwość istnieje tylko w iOS 9, więc sprawdź ją przed ustawieniem.
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Swift 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(powyższy kod z wstawki 0 separatora UITableView dla systemu iOS 8 nie działa )
EDYCJA: Oto czysta metoda Konstruktora interfejsów:
UWAGA: iOS 11 zmienia i upraszcza wiele z tego zachowania, nadchodzi aktualizacja ...