Подтвердить что ты не робот

Горизонтальный UITableView

Я хочу реализовать макет в моем приложении ipad, который имеет удобное представление, которое прокручивает влево и вправо, а не вверх и вниз:

Итак, вместо

строка 1 строка 2 ряд 3 (прокрутка по вертикали) Это было бы: строка 1, строка 2, строка 3 (прокрутка по горизонтали)

Я видел, что UItableView предназначен только для вертикальной прокрутки, поэтому преобразование не дает желаемого эффекта. Есть ли стандартный способ сделать это, используя преимущества поставщика данных, например, uitableview? Я в основном хочу сделать что-то похожее на то, что приложение для чтения BBC News на Ipad делает со списком историй для выбора.

Спасибо

4b9b3361

Ответ 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)
}