Я использую UITableView
для разметки контента «страницы». Я использую заголовки табличного представления для размещения определенных изображений и т. Д., И я бы предпочел, чтобы они не плавали, а оставались статичными, как они делают, когда установлен стиль UITableViewStyleGrouped
.
Другой, чем с помощью UITableViewStyleGrouped
, есть ли способ сделать это? Я хотел бы избегать использования группировки, так как это добавляет запас по всем моим ячейкам и требует отключения фонового представления для каждой из ячеек. Я хотел бы получить полный контроль над моим макетом. В идеале они должны быть "UITableViewStyleBareBones", но я не видел эту опцию в документах ...
Большое спасибо,
ios
objective-c
iphone
cocoa-touch
uikit
запутанный
источник
источник
Ответы:
Вы должны иметь возможность подделать это, используя пользовательскую ячейку для создания строк заголовка. Затем они будут прокручиваться, как и любая другая ячейка в табличном представлении.
Вам просто нужно добавить некоторую логику,
cellForRowAtIndexPath
чтобы вернуть правильный тип ячейки, когда это строка заголовка.Вам, вероятно, придется самостоятельно управлять своими разделами, то есть иметь все в одном разделе и подделывать заголовки. (Вы также можете попытаться вернуть скрытое представление для представления заголовка, но я не знаю, будет ли это работать)
источник
Вероятно, более простой способ добиться этого:
Objective-C:
Swift:
Заголовки разделов теперь будут прокручиваться, как и любая обычная ячейка.
источник
(Для тех, кто когда-либо попадал сюда из-за неправильного стиля таблицы) Измените стиль таблицы с простого на сгруппированный, с помощью инспектора атрибутов или с помощью кода:
источник
TableView Style
в виду, что вы также можете найти это свойство в AttributesInspector.ВНИМАНИЕ : это решение реализует зарезервированный метод API. Это может помешать Apple одобрить приложение для распространения в AppStore.
Я описал приватные методы, которые превращают заголовки разделов в мой блог.
По сути, вам просто нужно создать подкласс
UITableView
и вернутьсяNO
двумя способами:источник
Хорошо, я знаю, что уже поздно, но я должен был это сделать. Я потратил 10 часов на поиск рабочего решения, но не нашел полного ответа. Нашел некоторые подсказки, но их трудно понять начинающим. Таким образом, я должен был вставить свои 2 цента и закончить ответ.
Как было предложено в нескольких ответах, единственное рабочее решение, которое мне удалось реализовать, - это вставить обычные ячейки в табличное представление и обработать их как заголовки разделов, но лучший способ добиться этого - вставить эти ячейки в строка 0 каждого раздела. Таким образом, мы можем легко обрабатывать эти нестандартные заголовки без плава.
Итак, шаги есть.
Реализуйте UITableView со стилем UITableViewStylePlain.
Реализуйте titleForHeaderInSection как обычно (вы можете получить это значение, используя собственную логику, но я предпочитаю использовать стандартные делегаты).
Воплощение numberOfSectionsInTableView как обычно
Реализуйте numberOfRowsInSection как обычно.
Вернуть 0.0f в heightForHeaderInSection.
НЕ реализуйте viewForHeaderInSection. Удалите метод полностью вместо возврата ноль.
В высоту ForRowAtIndexPath. Проверьте, если (indexpath.row == 0) и верните желаемую высоту ячейки для заголовка раздела, иначе верните высоту ячейки.
Теперь в cellForRowAtIndexPath, проверьте, если (indexpath.row == 0), и реализуйте ячейку так, как вы хотите, чтобы был заголовок раздела, и установите стиль выбора равным none. Иначе реализуйте ячейку так, как вы хотите, чтобы была нормальная ячейка.
Теперь реализуем willSelectRowAtIndexPath и возвращаем nil, если indexpath.row == 0. Это будет заботиться о том, чтобы didSelectRowAtIndexPath никогда не запускалось для строки заголовка раздела.
И, наконец, в didSelectRowAtIndexPath, проверьте (indexpath.row! = 0) и продолжите.
С этим вы сделали. Теперь у вас есть идеально прокручиваемый, не плавающий заголовок раздела.
источник
В вашем Интерфейсном Разработчике нажмите на вашу проблему.
Затем перейдите к Инспектору Атрибутов и измените Стиль Обычный на Сгруппированный;) Легко
источник
Интересная вещь о UITableViewStyleGrouped состоит в том, что tableView добавляет стиль к ячейкам а не в TableView.
Стиль добавляется в ячейки как backgroundView как класс с именем UIGroupTableViewCellBackground, который обрабатывает рисование различного фона в соответствии с положением ячейки в разделе.
Поэтому очень простым решением будет использовать UITableViewStyleGrouped, установить backgroundColor таблицы в clearColor и просто заменить backgroundView ячейки в cellForRow:
источник
Измените ваш стиль TableView:
Согласно документации Apple для UITableView:
источник
Есть еще один хитрый способ. Основная идея состоит в том, чтобы удвоить номер раздела, и первый показывает только headerView, а второй показывает реальные ячейки.
Что нужно сделать, это реализовать делегаты headerInSection:
Этот подход также мало влияет на ваши источники данных:
По сравнению с другими подходами этот способ безопасен, не изменяя фрейм или наборы содержимого табличного представления. Надеюсь, что это может помочь.
источник
Самый простой способ получить то, что вы хотите, это установить стиль таблицы как
UITableViewStyleGrouped
, стиль разделителя какUITableViewCellSeparatorStyleNone
:Не пытайтесь вернуть вид нижнего колонтитула как
nil
, не забудьте установить высоту заголовка и вид заголовка, после того как вы получите то, что вы хотели.источник
Хотя это, возможно, не решит вашу проблему, оно помогло мне, когда я хотел сделать подобное. Вместо установки заголовка я использовал нижний колонтитул раздела выше. Что спасло меня, так это то, что этот раздел был небольшим и статичным по своей природе, поэтому он никогда не прокручивался ниже нижней части окна.
источник
Для Swift 3+
Просто используйте
UITableViewStyleGrouped
и установите нулевую высоту нижнего колонтитула с помощью следующего:источник
.leastNormalMagnitude
. Также нужно реализоватьtableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
viewForFooterInSection
функцию в этом случае.0
и.leastNormalMagnitude
имел тот же эффект. РеализацияviewForFooterSection
метода необходима. Вы должны вернуть ноль. Это на Swift 5.1 с Xcode 11.3.1.Думая, как подойти к этой проблеме, я вспомнил очень важную деталь о UITableViewStyleGrouped. UITableView реализует сгруппированный стиль (округленные границы вокруг ячеек) путем добавления пользовательского backgroundView к UITableViewCells, а не к UITableView. В каждую ячейку добавляется backgroundView в соответствии с его положением в разделе (верхние строки получают верхнюю часть границы раздела, средние - боковую, а нижний - ну, в общем, нижнюю часть). Итак, если мы просто хотим простой стиль и у нас нет настраиваемого backgroundView для наших ячеек (что имеет место в 90% случаев), тогда все, что нам нужно сделать, это использовать UITableViewStyleGrouped и удалить собственный фон , Это можно сделать, выполнив эти два шага:
Измените наш стиль tableView на UITableViewStyleGrouped. Добавьте следующую строку в cellForRow непосредственно перед тем, как мы вернем ячейку:
cell.backgroundView = [[[UIView alloc] initWithFrame: cell.bounds] autorelease];
И это все. Стиль tableView станет точно таким же, как UITableViewStylePlain, за исключением плавающих заголовков.
Надеюсь это поможет!
источник
Может быть, вы могли бы использовать
scrollViewDidScroll
на tableView и изменить наcontentInset
основе текущего видимого заголовка.Кажется, работает для моего случая использования!
источник
Другой способ сделать это - создать пустой раздел прямо перед тем, на котором вы хотите заголовок, и поместить свой заголовок в этот раздел. Поскольку раздел пуст, заголовок будет прокручиваться немедленно.
источник
Вы можете добавить один раздел (с нулевыми строками) выше, а затем установить вышеупомянутый sectionFooterView в качестве headerView текущего раздела, footerView не плавает. Надеюсь, это поможет.
источник
Игнорировать XAK. Не используйте частные методы, если хотите, чтобы ваше приложение было принято Apple.
Это проще всего, если вы используете Interface Builder. Вы бы добавили UIView в верхней части представления (куда будут добавляться изображения), а затем добавили свое табличное представление под ним. IB должен измерить это соответственно; то есть верхняя часть таблицы касается нижней части только что добавленного UIView, а его высота покрывает остальную часть экрана.
Мысль здесь в том, что если этот UIView на самом деле не является частью табличного представления, он не будет прокручиваться вместе с табличным представлением. т.е. игнорировать заголовок таблицы.
Если вы не используете конструктор интерфейса, это немного сложнее, потому что вы должны получить правильное расположение и высоту для таблицы.
источник
Проверьте ответ, как реализовать заголовки с помощью StoryBoard: представления заголовков таблиц в StoryBoards
Также обратите внимание, что если вы не реализуете
это не будет плавать, что именно то, что вы хотите.
источник
Чтобы полностью удалить заголовки плавающей секции, вы можете сделать это:
return nil
не работаетЧтобы отключить плавающие, но по-прежнему показывать заголовки разделов, вы можете предоставить собственное представление с собственным поведением.
источник
Вариант решения @ samvermette:
источник
Фрагмент отображает липкий заголовок только для первого раздела. Заголовки других разделов будут плавать с ячейками.
источник
Это может быть достигнуто путем назначения представления заголовка вручную в методе viewDidLoad UITableViewController вместо использования делегата viewForHeaderInSection и heightForHeaderInSection. Например, в вашем подклассе UITableViewController вы можете сделать что-то вроде этого:
Представление заголовка тогда исчезнет, когда пользователь прокрутит. Я не знаю, почему это работает так, но похоже, что вы достигаете того, что вы ищете.
источник
Может быть, вы можете просто сделать фон заголовка прозрачным:
Или примените это глобально:
источник
У меня есть другое, еще более простое решение, которое можно использовать без автоматической разметки и со всем, что делается через XIB:
1 / Поместите заголовок в табличное представление, перетащив его прямо в табличное представление.
2 / В инспекторе размера вновь созданного заголовка просто измените его авторазмер: оставляйте только верхний, левый и правый якоря, а также заливку горизонтально.
Это должно делать свое дело !
источник
Согласно ответу @ samvermette , Я реализовал приведенный выше код в Swift, чтобы программистам было проще использовать swift.
источник
ссылка: https://stackoverflow.com/a/26306212
let tableView = UITableView(frame: .zero, style: .grouped)
Pluse
Это помогло использовать пространство заголовка
источник
Последнее обновление 2020
Протестировано с Xcode 14.
Чтобы скрыть любой заголовок раздела, верните nil для заголовка делегата раздела.
источник
Вы можете легко добиться этого, реализовав метод viewForHeaderInSection в классе делегата tableview. этот метод ожидает UIView в качестве возвращаемого объекта (который является вашим представлением заголовка). я сделал то же самое в моем коде
источник