iOS 8.0 представляет свойство layoutMargins для ячеек и табличных представлений.
Это свойство недоступно в iOS 7.0, поэтому перед его назначением обязательно проверьте!
Простое решение - создать подкласс для вашей ячейки и переопределить свойство полей макета, как это предложено @ user3570727. Однако вы потеряете любое поведение системы, например наследование полей из безопасной зоны, поэтому я не рекомендую следующее решение:
(ObjectiveC)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}
(быстрый 4.2):
override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }
Если вы не хотите переопределять свойство или хотите установить его условно, продолжайте чтение.
В дополнение к этому layoutMargins
свойству Apple добавил свойство в вашу ячейку, которое не позволит ему наследовать настройки полей вашего табличного представления. Когда это свойство установлено, ваши ячейки могут настраивать свои собственные поля независимо от табличного представления. Думайте об этом как о переопределении.
Это свойство вызывается preservesSuperviewLayoutMargins
, и его установка NO
позволит layoutMargin
настройке ячейки переопределять все, что layoutMargin
установлено в вашем TableView. Это экономит время ( вам не нужно изменять настройки табличного представления ) и является более кратким. Пожалуйста, обратитесь к ответу Майка Абдуллы для подробного объяснения.
ПРИМЕЧАНИЕ: то, что следует, является чистой реализацией для настройки поля на уровне ячейки , как выражено в ответе Майка Абдуллы. Установка вашей ячейки preservesSuperviewLayoutMargins=NO
гарантирует, что ваш табличный вид не переопределяет настройки ячейки. Если вы действительно хотите, чтобы все представления таблицы имели одинаковые поля, измените код соответствующим образом.
Настройте поля в ячейках:
-(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];
}
}
Свифт 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
}
}
Установка для preservesSuperviewLayoutMargins
свойства вашей ячейки значения NO должна препятствовать тому, чтобы ваш вид таблицы переопределял поля вашей ячейки. В некоторых случаях, кажется, не работает должным образом.
Если все не удается, вы можете грубо форсировать поля таблицы:
-(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];
}
}
Свифт 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
}
}
... и все! Это должно работать на iOS 7 и 8.
РЕДАКТИРОВАТЬ: Мохамед Салех обратил мое внимание на возможное изменение в iOS 9. Возможно, вам придется установить вид таблицыcellLayoutMarginsFollowReadableWidth
, чтобы , NO
если вы хотите настроить врезки или поля. Ваш пробег может варьироваться, это не очень хорошо задокументировано.
Это свойство существует только в iOS 9, поэтому обязательно проверьте перед настройкой.
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Свифт 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(код выше из iOS 8 UITableView разделитель 0 не работает )
РЕДАКТИРОВАТЬ: Вот чистый подход Interface Builder:
ПРИМЕЧАНИЕ: iOS 11 изменяет и упрощает большинство из этих действий, будет обновление ...