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.
EDIT: Мохамед Салех звернув мою увагу на можливу зміну прошивкою 9. Ви , можливо , буде потрібно встановити Table View - х cellLayoutMarginsFollowReadableWidth
доNO
, якщо ви хочете налаштувати врізки або поля. Ваш пробіг може відрізнятися, це не дуже добре зафіксовано.
Ця властивість існує лише в iOS 9, тому обов'язково перевірте її перед налаштуванням.
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Швидкий 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(вищевказаний код із iset 8 UITableView-роздільник 0, не працює )
EDIT: Ось чистий підхід для створення інтерфейсів:
ПРИМІТКА: iOS 11 змінює та спрощує велику частину такої поведінки, буде оновлено оновлення ...