У меня есть приложение, в котором UITableView
для вставки разделителя заданы пользовательские значения - вправо 0
, влево 0
. Это прекрасно работает iOS 7.x
, однако, iOS 8.0
я вижу, что разделитель вставки по умолчанию установлен по умолчанию 15
справа. Даже если в xib-файлах он установлен 0
, он все равно отображается неправильно.
Как удалить UITableViewCell
поля разделителя?
ios
objective-c
swift
uitableview
ios8
user3570727
источник
источник
[UIColor clearColor]
и нарисовать свои собственные разделители. Вы намного более гибки в этом.UITableViewCellSeparatorStyle
значений по умолчанию. Даже принятый ответ, на мой взгляд, очень грязный взлом.Ответы:
iOS 8.0 представляет свойство layoutMargins для ячеек и табличных представлений.
Это свойство недоступно в iOS 7.0, поэтому перед его назначением обязательно проверьте!
Простое решение - создать подкласс для вашей ячейки и переопределить свойство полей макета, как это предложено @ user3570727. Однако вы потеряете любое поведение системы, например наследование полей из безопасной зоны, поэтому я не рекомендую следующее решение:
(ObjectiveC)
(быстрый 4.2):
Если вы не хотите переопределять свойство или хотите установить его условно, продолжайте чтение.
В дополнение к этому
layoutMargins
свойству Apple добавил свойство в вашу ячейку, которое не позволит ему наследовать настройки полей вашего табличного представления. Когда это свойство установлено, ваши ячейки могут настраивать свои собственные поля независимо от табличного представления. Думайте об этом как о переопределении.Это свойство вызывается
preservesSuperviewLayoutMargins
, и его установкаNO
позволитlayoutMargin
настройке ячейки переопределять все, чтоlayoutMargin
установлено в вашем TableView. Это экономит время ( вам не нужно изменять настройки табличного представления ) и является более кратким. Пожалуйста, обратитесь к ответу Майка Абдуллы для подробного объяснения.ПРИМЕЧАНИЕ: то, что следует, является чистой реализацией для настройки поля на уровне ячейки , как выражено в ответе Майка Абдуллы. Установка вашей ячейки
preservesSuperviewLayoutMargins=NO
гарантирует, что ваш табличный вид не переопределяет настройки ячейки. Если вы действительно хотите, чтобы все представления таблицы имели одинаковые поля, измените код соответствующим образом.Настройте поля в ячейках:
Свифт 4:
Установка для
preservesSuperviewLayoutMargins
свойства вашей ячейки значения NO должна препятствовать тому, чтобы ваш вид таблицы переопределял поля вашей ячейки. В некоторых случаях, кажется, не работает должным образом.Если все не удается, вы можете грубо форсировать поля таблицы:
Свифт 4:
... и все! Это должно работать на iOS 7 и 8.
РЕДАКТИРОВАТЬ: Мохамед Салех обратил мое внимание на возможное изменение в iOS 9. Возможно, вам придется установить вид таблицы
cellLayoutMarginsFollowReadableWidth
, чтобы ,NO
если вы хотите настроить врезки или поля. Ваш пробег может варьироваться, это не очень хорошо задокументировано.Это свойство существует только в iOS 9, поэтому обязательно проверьте перед настройкой.
Свифт 4:
(код выше из iOS 8 UITableView разделитель 0 не работает )
РЕДАКТИРОВАТЬ: Вот чистый подход Interface Builder:
ПРИМЕЧАНИЕ: iOS 11 изменяет и упрощает большинство из этих действий, будет обновление ...
источник
cell.preservesSuperviewLayoutMargins = NO
в соответствии с предложением @ bffmike или после прокрутки способов отображения вставок. (wtf ??)cell.preservesSuperviewLayoutMargins
в мой источник данных метода:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Arg !!! После игры или делайте это в своем
Cell
подклассе:или установив
cell.layoutMargins = UIEdgeInsetsZero;
фиксированный для меня.источник
separatorInset
в IB не работала. Существует также проблема с цветами фона табличного представления. это действительно больные вещи.Давайте на минутку разберемся с проблемой, прежде чем вслепую попытаться ее исправить.
Быстрый просмотр в отладчике скажет вам, что разделительные линии являются подпредставлениями
UITableViewCell
. Кажется, что сама клетка берет на себя значительную долю ответственности за расположение этих линий.iOS 8 представляет концепцию полей макета . По умолчанию поля макета представления располагаются
8pt
со всех сторон, и они наследуются от представлений предков.Насколько мы можем сказать, при
UITableViewCell
разметке его разделительной линии выбирается соблюдение левого поля макета, используя его для ограничения левой вставки.Собрав все это вместе, чтобы достичь желаемой вставки по-настоящему нуля, нам нужно:
0
Скажем так, это довольно простая задача для достижения:
Что следует отметить:
preservesSuperviewLayoutMargins
.preservesSuperviewLayoutMargins
, вы можете настроить предок представление (например, таблица) , чтобы иметь0
левый край тоже, но это , кажется , по своей природе более подвержены ошибкам , как вы не контролируете , что всю иерархию.0
и оставить остальные.UITableView
рисуются в нижней части таблиц простых стилей, была вставка 0 , я предполагаю, что для этого потребуется указать те же настройки на уровне таблицы (еще не пробовал!)источник
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
layoutMargins
иpreservesSuperviewLayoutMargins
на ячейку - это все, что требуется. Все остальное похоже на доверие к вуду.separatorInset
aUITableViewCell
в iOS 8, вы должны установить значениеUIEdgeInsets
0 на обаUITableView
иUITableViewCell
. Если вы не сделаете оба, у вас все еще будет левый вкладыш, который больше нуля. Я подтвердил это несколько раз.Я считаю, что это тот же вопрос, который я задал здесь: удалить SeparatorInset на iOS 8 UITableView для XCode 6 iPhone Simulator
В iOS 8 есть одно новое свойство для всех объектов, наследуемых от
UIView
. Итак, решение для установкиSeparatorInset
в iOS 7.x не сможет удалить пробел, который вы видите на UITableView в iOS 8.Новое свойство называется « layoutMargins ».
Решение:-
Если вы установите
cell.layoutMargins = UIEdgeInsetsZero;
без проверки, еслиlayoutMargins
существует, приложение будет зависать на iOS 7.x. Таким образом, лучшим способом было бы проверить,layoutMargins
существует ли раньшеsetLayoutMargins:UIEdgeInsetsZero
.источник
Вы можете использовать UIAppearance один раз при запуске приложения (до загрузки пользовательского интерфейса), чтобы установить его в качестве глобальных настроек по умолчанию:
Таким образом, вы сохраняете код вашего UIViewController в чистоте и всегда можете переопределить его, если хотите.
источник
iOS вводит свойство layoutMargins для ячеек и табличных представлений.
Это свойство недоступно в iOS 7.0, поэтому перед его назначением обязательно проверьте!
Тем не менее, Apple добавляла собственность называется preservesSuperviewLayoutMargins в камеру , что позволит предотвратить его от наследования параметров полеев в вашей таблице вида. Таким образом, ваши ячейки могут настраивать свои собственные поля независимо от табличного представления. Думайте об этом как о переопределении.
Это свойство называется preservedSuperviewLayoutMargins , и его значение NO может позволить вам переопределить настройки layoutMargin вашего табличного представления настройкой layoutMargin вашей собственной ячейки. Это экономит время ( вам не нужно изменять настройки табличного представления ) и является более кратким. Пожалуйста, обратитесь к ответу Майка Абдуллы для подробного объяснения.
ПРИМЕЧАНИЕ: это правильная, менее запутанная реализация, как выражено в ответе Майка Абдуллы; установка preservSuperviewLayoutMargins = NO для вашей ячейки гарантирует, что табличное представление не переопределит настройки ячейки.
Первый шаг - настройте поля ячеек:
Если для свойства preservSuperviewLayoutMargins в ячейке установлено значение NO, это не позволит переопределить поля таблицы в представлении таблицы. В некоторых случаях кажется, что он не работает должным образом.
Второй шаг - только если все не получится, вы можете перебором полей таблицы.
... и все! Это должно работать на iOS 8, а также iOS 7.
Примечание: протестировано с использованием iOS 8.1 и 7.1, в моем случае мне нужно было использовать только первый шаг этого объяснения.
Второй шаг требуется только в том случае, если под визуализированными ячейками имеется незаселенная ячейка, т.е. если таблица больше, чем количество строк в модели таблицы. Невыполнение второго шага приведет к различным смещениям разделителя.
источник
willDisplayCell
методе, поскольку сам метод уже является iOS 8+ и никогда не будет вызываться из более старых версий.В Swift это немного раздражает, потому что
layoutMargins
это свойство, поэтому вы должны переопределить метод получения и установки .Это эффективно сделает
layoutMargins
readonly, что в моем случае хорошо.источник
Для iOS 9 вам нужно добавить:
Для более подробной информации, пожалуйста, обратитесь к вопросу .
источник
Я просто хотел поделиться расширением, которое я сделал, чтобы удалить поля из разделителей ячеек таблицы.
Используется в контексте:
источник
Swift:
источник
Я сделал это, сделав это:
источник
Что касается того, что предложил cdstamper вместо табличного представления, то добавление строк ниже в методе layoutSubview ячейки работает для меня.
источник
Пример Swift 3.0:
источник
После долгих исследований ...
Вот единственный способ полностью контролировать этот материал (который я смог найти)
Для полного контроля вставок разделителя и полей макета в каждой ячейке. Сделайте это в
willDisplayCell
методе на вашемUITableviewDelegate
.Объект ячейки контролирует разделитель, а
contentView
контролирует все остальное. Если ваши места вставки разделителя отображаются неожиданным цветом, это должно решить эту проблему:источник
Простое решение в Swift для iOS 8 с кастомным
UITableViewCell
Таким образом, вы устанавливаете
layoutMargin
иseparatorInset
только один раз вместо того, чтобы делать это для каждого,willDisplayCell
как предлагает большинство из приведенных выше ответов.Если вы используете кастом,
UITableViewCell
это правильное место для этого. В противном случае вы должны сделать это вtableView:cellForRowAtIndexPath
.Еще один совет: вам не нужно устанавливать,
preservesSuperviewLayoutMargins = false
потому что значение по умолчанию ужеNO
!источник
Для меня простая линия сделала работу
источник
Просто добавьте ниже код может решить эту программу.
Удачи тебе!
источник
Ответ Лукаша в Свифте:
источник
Вот код, который работает для меня, в Swift:
Это кажется мне наиболее чистым (на данный момент), так как все корректировки края / поля в cell / tableView выполняются в
tableView:willDisplayCell:forRowAtIndexPath:
методе, без добавления ненужного кодаtableView:cellForRowAtIndexPath:
.Кстати, я только устанавливаю левую ячейку separatorInset / layoutMargins, потому что в этом случае я не хочу испортить мои ограничения, которые я установил в своей ячейке.
Код обновлен до Swift 2.2:
источник
Большинство ответов показывает разделительные врезки и макет поля создаются над различными методами (т.е.
viewDidLayoutSubviews
,willDisplayCell
и т.д.) для клеток и tableviews, но я обнаружил , что просто положить их вcellForRowAtIndexPath
произведениях великих. Похоже, самый чистый способ.источник
Используйте приведенный ниже фрагмент кода, чтобы избежать нежелательной проблемы с заполнением для UITableView в IOS 8 и 7.
источник
Вместо обновления
preservesSuperviewLayoutMargins
иlayoutMargins
каждый раз, когда ячейка прокручивается (используетwillDisplayCell
), я бы предложил сделать это один раз вcellForRowAtIndexPath:
:источник
Вот простой способ удалить вкладку глобально.
В
UITableViewCell+Extensions.swift
:В
AppDelegate
application:didFinishLaunchingWithOptions:
:Вы можете подумать: а) просто переопределить
separatorInset
расширение или б) установитьlayoutMargins
вместо него прокси внешнего вида . Ни один не будет работать. Даже еслиseparatorInset
это свойство указано, попытка переопределить его как свойство (или метод) приводит к ошибкам компилятора. И установив внешний вид прокси дляUITableViewCell
«slayoutMargins
(или, по этому вопросу, а также настройки внешнего вида прокси дляUITableView
» slayoutMargins
иseparatorInset
) не имеет никакого эффекта.источник
В iOS8:
Добавление этого в мой подкласс UITableViewCell:
и это для "tableView: cellForRowAtIndexPath" или "tableView: willDisplayCell":
Работал для меня
источник
Для любой конкретной ячейки вы хотите скрыть разделитель.
источник
Посмотрев ответы на 3-м этаже, я попытался выяснить, каково отношение установки разделителя между TableView и TableViewCell, и провел некоторый тест. Вот мои выводы:
мы можем считать, что установка разделителя ячейки в ноль должна сдвинуть разделитель в два шага: первый шаг - установить нулевой разделитель ячейки . Второй шаг - установить значение marginlayout ячейки на ноль.
установить Tableview в separatorinset и marginlayout может повлиять на клетки separatorinset . Тем не менее, из теста я обнаружил, что разделитель TableViewinset кажется бесполезным, marginlayout TableView может фактически влиять на marginlayout ячейки .
set PresesSuperviewLayoutMargins = Cell, может обрезать эффект marginlayout TableView на ячейки.
одно из решений:
источник
Это моё решение. Это относится к пользовательскому подклассу ячейки, просто добавьте их оба к подклассу.
2.
И удобно, что вы можете настроить положение разделителя, не прося вашего дизайнера нарисовать его для вас ..........
источник
Более компактным способом, чем ответ с наибольшим количеством голосов ...
}
источник
Добавление этого фрагмента, простой элегантный в Swift работает для меня в iOS8 :)
источник
Это отлично сработало для меня в iOS 8 и iOS 9.
Для OBJ-C
источник