Обнаружение прокрутки в подклассе UIScrollView

#iphone #uiscrollview #subclass

#iPhone #uiscrollview #подкласс

Вопрос:

Доброе утро,

Я создал подкласс UIScrollView и теперь хочу знать, когда пользователь выполняет прокрутку в моем подклассе. Для этого я реализовал это следующим образом:

ImageScroller.h

 @interface UIImageScroller : UIScrollView <UIScrollViewDelegate> {
  

ImageScroller.m (в рамках @implementation)

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    NSLog(@"did scroll");
}
  

Проблема в том, что метод scrollViewDidScroll, похоже, не запускается.
Есть ли какая-либо возможность заставить это работать?

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

  - (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        self.directionalLockEnabled = YES;
        [self setDelegate:self];
    }
    return self;
}
  

Я добавил ScrollView в свой XIB-файл и установил класс, если он соответствует моему ImageScroller. Также я установил владельца файла и использую UIScrollViewDelegate в .h-файле ViewController, а также реализую метод scrollViewDidScroll в .m-файле.

Когда я устанавливаю делегат моего ImageScroller в коде .m-файла из XIB, например [imageScroller setDelegate:imageScroller], scrollViewDidScroll запускается в моем ImageScroller-подклассе, но тот, что в моем ViewController, не запускается, но мне нужны оба.

Какие-либо решения для этого?

Заранее спасибо за ваши ответы.

Ответ №1:

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

В подклассе я переопределил следующие методы

 //Override this to detect when the user is scrolling, this is also triggered during view
//layout.  Here you can check your deceleration rate and determine when the scrolling has
//grinded to a halt.
-(void)setContentOffset:(CGPoint)contentOffset

//Override this to detect when the view has been resized (just a handy override)
-(void)setFrame:(CGRect)frame;
  

Что касается других UIScrollViewDelegate методов, то, на мой взгляд, за их обработку должен отвечать контроллер просмотра.

Ответ №2:

Я думаю, вы можете попробовать установить self.delegate = self; для получения событий.

Комментарии:

1. Я пробовал это так, но по какой-то причине это не работает. — (идентификатор)initWithCoder:(NSCoder *)aDecoder { if ((self = [super initWithCoder: aDecoder])) { self.directionalLockEnabled = YES; [self setDelegate:self]; } возвращает self; }

2. Я добавил ScrollView в свой XIB-файл и установил класс в свой ImageScroller. Я также установил владельца файла и использую UIScrollViewDelegate в .h-файле ViewController, а также реализую метод scrollViewDidScroll в .m-файле. Возможно, это проблема?

3. Я не понял этого с первого раза 🙂 Итак, ваш метод делегирования работает, но только в вашем делегате (просмотр прокрутки)? Ну, так и должно быть, потому что есть только один делегат. Я думаю, вы могли бы затем установить делегат для своего контроллера и сделать это примерно так - (void)scrollViewDidScroll:(UIScrollView *)scrollView { //do controller stuff here [self.view scrollViewDidScroll:(UIScrollView *)self.view]; } , но я все еще не уверен, что проблема в этом.

Ответ №3:

Если кто-то ищет быстрый ответ, это так просто, как это:

 override var contentOffset: CGPoint {
    didSet {
        if contentOffset != oldValue {
            //same as scrollViewDidScroll
        }
    }
}