У меня странная проблема UITableView
только с iOS 7.
UITableViewCellSeparator
исчезает над первой строкой и под последней строкой. Иногда после выбора строк или некоторых действий прокрутки он появляется.
В моем случае tableView
загружается из стиля Storyboard
with UITableViewStylePlain
. Проблема точно не в том UITableViewCellSeparatorStyle
, что по умолчанию не изменилось UITableViewCellSeparatorStyleSingleLine
.
Как я читал на форумах Apple Dev ( здесь и здесь ), у других людей есть такая проблема, и можно найти некоторые обходные пути, например:
Workaround: disable the default selection and recreate the behaviour in a method
trigged by a tapGestureRecognizer.
Но я все еще ищу причину такого странного поведения разделителя.
Любые идеи?
Обновление: как я видел в бета-версии XCode 5.1 DP и iOS 7.1, Apple пыталась решить эту проблему. Теперь разделитель отображается по мере необходимости, иногда под последней строкой, после некоторого обновления, но не после создания представления таблицы.
Ответы:
Я сбросил иерархию подпредставлений затронутых ячеек и обнаружил, что для них
_UITableViewCellSeparatorView
установлено значение скрыто. Не зря его не показывают!Я переопределил
layoutSubviews
в своемUITableViewCell
подклассе, и теперь разделители отображаются надежно:Цель-C :
Swift :
Другие предлагаемые здесь решения не работали для меня последовательно или казались неуклюжими (добавление пользовательских представлений нижнего колонтитула 1 пиксель).
источник
Это сработало для меня:
источник
Я также имел проблемы с отсутствующими сепаратора , и я обнаружил, что проблема возникла только тогда , когда
heightForRowAtIndexPath
был возвращающая десятичное число . Решение:источник
Вы пытались добавить UIView высоты 1 в заголовок и нижний колонтитул таблицы со светло-серым цветом фона? В основном он будет издеваться над первым и последним разделителями.
источник
@samvermette
Я решил проблему, используя методы делегата. Теперь не мерцает:
источник
Мы столкнулись с этой проблемой в нашем приложении. Когда пользователь выбрал ячейку, новое представление таблицы было помещено в стек контроллера навигации, а затем, когда пользователь вытащил его, разделитель отсутствовал. Мы решили его, положив
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
вdidSelectRowAtIndexPath
метод делегата табличного.источник
self.tableView.allowsMultipleSelection = NO;
?Вот более простой (хотя и немного запутанный) обходной путь, если он вам нужен, попробуйте выбрать и отменить выбор ячейки после перезагрузки данных и выполнения анимации по умолчанию.
просто добавь:
источник
Я обнаружил, что самое простое решение - после перезагрузки ячейки также перезагрузить ячейку выше:
источник
Простое и понятное решение, работающее как на iOS 8, так и на iOS 9 (beta 1).
Вот простой, чистый и ненавязчивый обходной путь. Он включает в себя вызов метода категории, который исправит разделители.
Все, что вам нужно сделать, это пройти вниз по иерархии ячейки и отменить скрытие разделителя. Как это:
Я рекомендую добавить это в категорию на UITableViewCell, например:
Поскольку разделитель может исчезнуть в ячейке, отличной от выбранной в данный момент, вероятно, неплохо было бы вызвать это исправление для всех ячеек в представлении таблицы. Для этого вы можете добавить в UITableView категорию, которая выглядит следующим образом:
Имея это на месте, вы можете вызвать
-fixSeparatos
свой tableView сразу после действия, которое заставляет их исчезнуть. В моем случае это было после звонка[tableView beginUpdates]
и[tableView endUpdates]
.Как я уже говорил в начале, я тестировал это как на iOS 8, так и на iOS 9. Я предполагаю, что он будет работать даже на iOS 7, но у меня нет возможности попробовать это там. Как вы, вероятно, знаете, это работает с внутренними компонентами ячейки, поэтому может перестать работать в некоторых будущих версиях. И Apple теоретически может (вероятность 0,001%) отклонить ваше приложение из-за этого, но я не понимаю, как они могут даже узнать, что вы там делаете (проверка суффикса класса не может быть обнаружена статическими анализаторами как что-то плохо, ИМО).
источник
Основываясь на комментарии @ ortwin -gentz, это решение работает для меня в iOS 9.
(Swift-код)
Я использую функцию fixCellsSeparator () после вызова endUpdates () в некоторых методах моего tableView, например:
Надеюсь, это решение будет кому-то полезно!
источник
Дополнение к ответу airpaulg.
Таким образом, в основном нужно реализовать два метода UITableDelegate. Вот мое решение, которое работает как на iOS7, так и на iOS6.
// Это скроет пустую сетку таблицы под ячейками, если они не покрывают весь экран
источник
Это устранило проблему для меня:
Убедитесь, что
clipsToBounds
для ячейки установлено значение ДА, а для ячейки - НЕТcontentView
. Также установитеcell.contentView.backgroundColor = [UIColor clearColor];
источник
Похоже, эта проблема проявляется при очень многих обстоятельствах.
Для меня это как-то связано с выбором ячеек. Я понятия не имею, почему, и у меня не было времени вникать в это слишком глубоко, но я могу сказать, что это начало происходить, когда я установил для ячейки значение «
selectionStyle
Нет». то есть:Я попытался использовать некоторые из вышеперечисленных методов делегата, которые включают и выключают
separatorStyle
свойство объекта,tableView
но, похоже, они ничего не сделали для решения моей проблемы.Вся причина, по которой мне это было нужно, заключалась в том, что мне даже не требовался выбор ячейки.
Итак, я нашел то, что сработало для меня. Я просто отключил выделение на
UITableView
:Надеюсь, это кому-то поможет, если вам не нужно выбирать ячейки.
источник
Я попробовал так много предложений исправить, но не могу это исправить. Наконец, я решил настроить собственную разделительную линию, как показано ниже:
P / S: custom at willDisplayCell НЕ cellForRowAtIndexPath
источник
Как ни странно, изменение
separatorInset
значения ячейки взад и вперед похоже работает:источник
У меня также была проблема с этим непоследовательным отображением разделительной линии в нижней части моего UITableView. Используя настраиваемое представление нижнего колонтитула, я смог создать аналогичную строку и отобразить ее поверх потенциально существующей (которая иногда отсутствовала).
Единственная проблема этого решения в том, что Apple может однажды изменить толщину линии.
источник
Я решил разместить эти строки кода там, где происходит обновление tableview:
Например, в моем случае я поместил их сюда:
источник
Перед обновлением ячейки вам необходимо удалить выделение ячейки. Тогда вы сможете восстановить выбор.
источник
Чтобы исправить указанную выше проблему, добавьте пустой нижний колонтитул в viewDidLoad.
Пожалуйста, не используйте приведенные выше строки в методе делегата viewForFooterInSection. Значит, не реализовывать метод viewForFooterInSection.
источник
чтобы расширить ответ на airpaulg, потому что это не совсем сработало для меня ..
мне также пришлось реализовать метод heightforfooter, чтобы получить высоту
затем я заметил, что светло-серый цвет слишком темный. Я исправил это, взяв текущий цвет разделителя таблицы и используя это:
UIColor *separatorGray = [self.briefcaseTableView separatorColor]; [footerSeparator setBackgroundColor:separatorGray];
источник
Я тоже столкнулся с этой проблемой в нашем проекте. В моем табличном представлении был tableFooterView, который мог это сделать. Я обнаружил, что разделитель под последней строкой появится, если я удалю этот tableFooterView.
источник
Что имело значение для меня, так это перезагрузка строки, для которой нижняя разделительная линия не появлялась:
источник
Я решаю эту проблему другим способом: добавляю слой с высотой 0,5 пикселя и светло-серым цветом в tableview.tableFooterView в качестве его подслоя.
код такой:
источник
В своем подклассе UITableViewCell реализуйте layoutSubviews и добавьте:
источник
Как заметил кто-то другой, эта проблема проявляется по-разному. Я решил проблему с помощью следующего обходного пути:
источник
Просматривая ответы и решения, я пришел к таким наблюдениям:
Это кажется проблематичным как в iOS 7, так и в 8. Я заметил проблему при выборе ячейки из кода в
viewDidLoad
методе так:1) обходной путь делал это,
viewDidAppear:
если кто-то не возражает против заметной задержки между представлением представления и выбором ячейки2) второе решение сработало для меня, но код выглядит немного хрупким, поскольку он основан на внутренней реализации
UITableViewCell
3) добавление собственного разделителя кажется наиболее гибким и лучшим на данный момент, но требует большего количества кода :)
источник
У
viewWillAppear
меня сработала установка стиля .источник
Поскольку это все еще проблема с IOS 8, я добавлю свое решение в Swift. Установите для разделительной линии tableview значение none. Затем добавьте этот код в метод делегата cellForRowAtIndexPath. Это добавит красивый разделитель. Оператор if позволяет решить, какие ячейки должны иметь разделитель.
источник
Вот мое решение этой проблемы. После того, как вы вставите ячейку (я), перезагрузите раздел. Если перезагрузка всего раздела слишком интенсивна для вас, просто перезагрузите indexPaths вверху и внизу.
источник
столкнулся с аналогичной проблемой, я обнаружил, что еще одно хорошее решение, особенно если ваш dataSource небольшой, - это перезагрузить tableData при реализации
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
метода, вот пример:Вы также можете просто перезагрузить невидимые данные на основе видимого источника данных, но для этого потребуется еще немного взлома.
Имейте в виду, что эта функция делегата подпадает под
UITableViewDelegate
протокол!Надеюсь, поможет!
источник