2009-04-05 4 views
14

Я хочу реализовать пользовательское, многоразовое и эффективное поведение прокрутки в приложении iPhone, поэтому я расширяю UIScrollView с помощью моего пользовательского элемента управления и хочу отслеживать движения прокрутки.Расширение событий прокрутки UIScrollView и мониторинга

Теперь я знаю, что я мог бы назначить свой собственный контроль как UIScrollViewDelegate и внутренне реагировать на scrollViewDidScroll вызовов, но это не чувствует себя правильно мне (я могу ошибаться).

Неправильно, поскольку делегат нацелен на конкретную логику пользовательского интерфейса, а элементы управления должны быть на уровне выше этого. Это также означало бы, что мне нужно будет перенаправить вызовы делегатов, если класс приложения также назначил себя как делегат, который кажется неэффективным.

Как прямой потомок UIScrollView Я бы ожидать, чтобы иметь возможность переопределить метод, который запускает scrollViewDidScroll делегат вызова или быть предоставлен доступ к методу шаблон, или слушать для событий прокрутки, но я такие параметры не видны.

Глядя на файл UITableView.h, UITableView, кажется, не ставит перед собой в качестве UISCrollViewDelegate так мне интересно, как он управляет этим (я предполагаю, что, как он перерабатывает клетку он должен отслеживать их положение относительно видимых границ).

Я довольно новичок в этой платформе, поэтому, возможно, мне не хватает чего-то очевидного. Любая помощь оценивается.

+0

Вы когда-нибудь находили хорошее решение? –

+0

Я побежал с реализацией UIScrollViewDelegate в конце и дважды делегировал действия UIScrollViewDelegate из моего настраиваемого компонента. Я думаю, что ответ Роба внизу звучит по правильному пути, но он немного опоздал на работу, которую я делал, поэтому у меня не было возможности исследовать ее, к сожалению. –

ответ

17

Обнаружено это!(Совершенно случайно)

я смирился, чтобы назначить мой UIScrollView подкласс в качестве делегата в супер затем реализации scrollViewDidScroll: метод делегата, однако часть пути за счет реализации я получил исключение в середине моего метода scrollViewDidScroll. . Один быстрый взгляд на трассировке стека показал мне, что мой метод делегата был фактически вызван из setContentOffset:

Оказывается, если вы переопределения setContentOffset: вы получите вызов каждый раз, когда вид прокрутки движется! и поставляется с удобным contentOffset структуры, чтобы сказать вам, где вид прокрутки в настоящее время :)

- (void)setContentOffset:(CGPoint)contentOffset 
{ 
    [super setContentOffset:contentOffset]; 

    NSLog(@"ViewDidScroll: %f, %f", contentOffset.x, contentOffset.y); 
} 
+0

Awesome, спасибо! – BigCheesy

+0

Идеальное решение. Вы сохранили мой день :) Спасибо – gstream79

0

(я могу ошибаться)

Я думаю, что вы. Не понимая детали вашего приложения, методы делегата звучат точно так, как вы хотите. Имейте в виду, что контроллер (UIViewController подкласс) также может быть делегатом его представления.

0

Я думаю, что передача делегата - это то, что вы хотите. Это позволит вам использовать опубликованный API, который обычно рекомендуется, а не переопределяет функции, о которых вы не должны знать. Я согласен с тем, что это кажется более беспорядочным, чем должно быть, но если в UIScrollViewDelegate есть крючки, то вам нужно, чтобы ваши настройки были похожи на то, что это ваш лучший выбор.

Вы также можете предоставить свой собственный объект или протокол делегата, независимо от того, как UIViewController использует ваше представление прокрутки, чтобы сделать некоторую определенную логику просмотра.

3

Я согласен с вашей первоначальной оценкой. Если вы меняете логику прокрутки (а не на прокрутку), это подкласс, а не делегат.

UIScrollView предназначен для подкласса и включает в себя небольшое обсуждение об этом в ссылке. В частности, он предлагает переопределить -touchesShouldBegin:withEvent:inContent:, pagingEnabled и touchesShouldCancelInContentView:, которые, вероятно, являются тем местом, где вы хотите выполнять работу, которую вы описываете.

-1

Вы можете использовать следующий протокол для прослушивания прокрутки позиции:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    NSLog(@"scroll"); 
} 

См this link (Apple, документы на UIScrollViewDelegate).

См. Также this link (некоторый код для создания делегата).

2

Если вы сомневаетесь, вы обязательно должны пойти на методы делегатов, однако иногда (мне нужно было сделать это сейчас только за последние 5 лет в iOS-dev) подкласс - это путь.

Ответ Джо-эла подходит для Obj-C. Здесь он находится в Свифте:

class FeedScrollView: UIScrollView { 

    override var contentOffset: CGPoint { 
     willSet(newContentOffset) { 
      print("About to set Offset: \(newContentOffset)") 
     } 
    } 
} 
+0

Этот метод запускается один или несколько раз (непрерывно, пока он прокручивается) за прокрутку? – sharshi

Смежные вопросы