iPhone - как симметрично прокрутить два UITableView - PullRequest
4 голосов
/ 05 августа 2011

В моем приложении у меня есть два tableViews рядом. Когда пользователь выполняет прокрутку, я бы хотел, чтобы вторая прокручивалась одновременно, поэтому она выглядит почти как одна таблица с двумя разными столбцами. Я немного растерялся, как это делать, какие-либо предложения?

Спасибо, Грег

Ответы [ 5 ]

11 голосов
/ 05 августа 2011

Удобно, UITableView является подклассом UIScrollView.Существует UIScrollViewDelegate, который имеет этот метод:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

Если вы реализуете этот метод, вы можете получить свойство contentOffset аргумента scrollView.Затем вы должны использовать

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated

и установить новое смещение контента.Итак, что-то вроде этого:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    UIScrollView *otherScrollView = (scrollView == self.tableView1) ? self.tableView2 : self.tableView1;
    [otherScrollView setContentOffset:[scrollView contentOffset] animated:NO];
}

Вы можете привести к UITableView, если хотите, но для этого нет особой причины.

9 голосов
/ 05 августа 2011

Вы захотите взглянуть на UIScrollViewDelegate - скажем, у вас есть два вида прокрутки, A и B .

Используйте метод делегата scrollViewDidScroll представления прокрутки A , чтобы получить смещение, а затем в том же вызове метода setContentOffset для представления прокрутки B , передав значение вы получаете от делегата.

На самом деле это не должно быть больше, чем 2-3 строки кода после того, как вы настроили свои методы делегата.

7 голосов
/ 05 августа 2011

Кроме того, просмотр таблицы, который был прокручен пользователем, не должен отправляться setContentOffset: message в scrollViewDidScroll, так как это приведет к бесконечному циклу приложения.поэтому для решения проблемы должны быть реализованы дополнительные методы UIScrollViewDelegate:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    beingScrolled_ = nil;
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{    
    if(beingScrolled_ == nil)
        beingScrolled_ = scrollView;
}

и изменение версии scrollViewDidScroll в Inspire48: соответственно:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    UIScrollView *otherScrollView = (scrollView == self.tableView1) ? self.tableView2 : self.tableView1;
    if(otherScrollView != beingScrolled)
    {
        [otherScrollView setContentOffset:[scrollView contentOffset] animated:NO];
    }
}

где BeingScrolled_ - это ивар типа UIScrollView

1 голос
/ 21 октября 2018

UITableView является подклассом UIScrollView.Быстрое решение:

extension yourViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let otherScrollView = (scrollView == tableViewLeft) ? tableViewRight : tableViewLeft
        otherScrollView?.setContentOffset(scrollView.contentOffset, animated: false)
    }
}

И остановите отскок обеих таблиц

tableViewLeft.bounces = false
tableViewRight.bounces = false

Если вы хотите, чтобы индикаторы вертикальной прокрутки работали, напишите следующий код

tableViewLeft.showsVerticalScrollIndicator = false
tableViewRight.showsVerticalScrollIndicator = false
0 голосов
/ 31 августа 2016

в быстрой прокрутке два подходящих вида симметрично:

func scrollViewDidScroll(scrollView: UIScrollView) {
    if tb_time1 == scrollView {
        tb_time2.contentOffset = tb_time1.contentOffset
    }else if tb_time2 == scrollView {
        tb_time1.contentOffset = tb_time2.contentOffset
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...