Горизонтальный UITableView
Я хочу реализовать макет в моем приложении ipad, который имеет удобное представление, которое прокручивает влево и вправо, а не вверх и вниз:
Итак, вместо
строка 1
строка 2
ряд 3
(прокрутка по вертикали)
Это было бы:
строка 1, строка 2, строка 3
(прокрутка по горизонтали)
Я видел, что UItableView предназначен только для вертикальной прокрутки, поэтому преобразование не дает желаемого эффекта. Есть ли стандартный способ сделать это, используя преимущества поставщика данных, например, uitableview?
Я в основном хочу сделать что-то похожее на то, что приложение для чтения BBC News на Ipad делает со списком историй для выбора.
Спасибо
Ответы
Ответ 1
Я опубликовал образец кода, который демонстрирует один подход для реализации горизонтальных прокручиваемых табличных представлений с использованием преобразований. Он называется EasyTableView и предоставляет тот же интерфейс для просмотра таблиц с вертикальной и горизонтальной прокруткой.
Ответ 2
Это метод, который я использую:
1) Внедрите собственный подкласс UITableView и переопределите его метод initWithCoder:
, как показано ниже:
- (id)initWithCoder:(NSCoder *)aDecoder
{
assert([aDecoder isKindOfClass:[NSCoder class]]);
self = [super initWithCoder:aDecoder];
if (self) {
const CGFloat k90DegreesCounterClockwiseAngle = (CGFloat) -(90 * M_PI / 180.0);
CGRect frame = self.frame;
self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, k90DegreesCounterClockwiseAngle);
self.frame = frame;
}
assert(self);
return self;
}
2) Создайте свой собственный класс UITableViewCell и снова переопределите initWithCoder:
:
- (id)initWithCoder:(NSCoder *)aDecoder
{
assert([aDecoder isKindOfClass:[NSCoder class]]);
self = [super initWithCoder:aDecoder];
if (self) {
const CGFloat k90DegreesClockwiseAngle = (CGFloat) (90 * M_PI / 180.0);
self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, k90DegreesClockwiseAngle);
}
assert(self);
return self;
}
3) Теперь вы можете создать элемент UITableView в IB и установить его класс как "MyHorizontalTableView" в инспекторе идентификации.
4) Создайте свой элемент UITableViewCell в IB и установите его класс как "MyHorizontalTableViewCell" в инспекторе идентификации.
И что это.
Это может быть связано с переопределением других инициализаторов, если вы предпочитаете не использовать IB для создания представления в виде таблицы или ячейки.
A образец проекта, который я построил вокруг этой концепции, можно найти в GitHub.
Ответ 3
Если вы можете ограничить свое приложение только iOS 6 и выше, лучший способ сделать это - UICollectionView.
Если вам нужно поддерживать iOS 4/5, попробуйте одну из реализаций OpenIC UICollectionView, например. PSTCollectionView
Ответ 4
Этот вопрос был ответил apple. Пример прокрутки с помощью яблока
Демонстрирует, как реализовать два различные типы UIScrollViews. первый скроллер содержит несколько изображения, показывающие, как макет большой содержимое с несколькими фрагментами данных (в нашем случае 5 отдельных UIImageViews).
это работает и для iPad.
Ответ 5
Теперь вам нужно использовать UIScrollView и устанавливать прокрутку только по горизонтали. Что касается данных, которые вам нужно обрабатывать самостоятельно и самостоятельно. Если вы не ожидаете более дюжины или около того объектов, вы можете, вероятно, пропустить их, но если они интенсивно работают с данными, попытайтесь реализовать подобный поиск и загрузку данных, как использует UITableView. Обратите внимание, что приложение для чтения новостей BBC также использует пейджинг, позволяющий прокручивать каждую страницу (4 или около того значка новостей).
Ответ 6
Я написал простой подкласс UIScrollView, который, как UITableView, реализует повторное использование ячеек, projet MMHorizontalListView находится на gitHub, есть также тестовый проект, поэтому вы можете увидеть, как использовать его с примером, он также работает со старыми версиями iOS, такими как 4.x(возможно, даже старше...)
Ответ 7
Существует простой блестящий трюк, чтобы заставить UITableView выполнять вертикальную и горизонтальную прокрутку.
Вы можете сделать это как с автозапуском, так и без него - я объясню это с автозапуском.
У вас UITableView имеет ограничение ширины и ограничение ограничения выравнивания.
Свяжите это ограничение ширины с IBOutlet и в своем контроллере установите следующие свойства в представлении таблицы.
let contentWidth = 1000 // you calculate that
tableViewWidthConstraint.constant = contentWidth
tableView.contentSize.width = (contentWidth * 2) - UIScreen.main.bounds.size.width
В представлении таблицы должна быть полная ширина, чтобы отобразить все содержимое в горизонтальном направлении, и мы играем с размером содержимого по сравнению с размером экрана, который делает трюк.
Ниже перечислены нижеуказанные местоположения, но вы можете попробовать выполнить разные шаги на жизненном цикле:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableViewWidthConstraint.constant = contentWidth
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
tableView.contentSize.width = (contentWidth * 2) - UIScreen.main.bounds.size.width
}
// and this is needed to support rotation:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) -> Void in
self.tableView.contentSize.width = (contentWidth * 2) - UIScreen.main.bounds.size.width
}, completion: nil)
}
super.viewWillTransition(to: size, with: coordinator)
}