iOS UIScrollView - обнаружение пролистывания - средний значок большой, другие значки меньше - PullRequest
1 голос
/ 16 января 2012

У меня есть прокрутка, которая всегда показывает три элемента. Мне нужно, чтобы средний элемент был большим, а элементы слева и справа - маленькими.

Мой вопрос: как я могу обнаружить перелистывание? То, что я планировал сделать, - это каждый раз, когда представление прокрутки было «разбито на страницы», мы обнаруживаем его, затем проверяем все элементы в представлении прокрутки - если элемент находится в среднем «кадре», мы делаем его больше, в противном случае он меньше.

Пойду ли я об этом лучше всего?

1 Ответ

3 голосов
/ 16 января 2012

Вам необходимо иметь делегата на UITableView, который принимает сообщение scrollViewDidScroll: (или, возможно, scrollViewDidEndDecelerating:, в зависимости от ваших потребностей). См. документацию UITableViewDelegate .

Я делаю такую ​​проверку внутри scrollViewDidScroll. Я проверяю текущее смещение содержимого, и если прямоугольник, образованный текущим смещением и размером рамки просмотра с прокруткой, соответствующим образом пересекается с одной из моих страниц просмотра с прокруткой, то у меня обновляется page. Здесь вы можете захотеть масштабировать каждый элемент пропорционально тому, как близко он находится к центру текущего смещения содержимого (что создаст хороший эффект увеличения стиля дока для вашего скроллера).

Редактировать: Итак, гипотетический непроверенный псевдокод для массива "элементов" в скроллере, который перемещается по горизонтали.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
  CGPoint *currentOffset = scrollView.contentOffset;

  for (UIView *item in itemsToDisplay)
  {
    // The location in the entire scroll view canvas at which
    // we consider this item to "live"
    CGPoint *naturalCentre = item.naturalCentre;

    // How far from our desired point are we?
    CGFloat scale = 100 - fabs(naturalCentre.x - contentOffset.x);
    // Clamp this to positive values only, and normalize from 0.5 to 1
    scale = 0.5 + (scale < 0 : 0 ? (scale / 200));

    // Scale this view accordingly
    item.layer.contentsScale = scale;
  }
}

Это списано с манжеты и потребует довольно много отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...