Обнаружение прокрутки в подклассе UIScrollView - PullRequest
7 голосов
/ 15 апреля 2011

Доброе утро,

Я создал подкласс 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.Также я установил Fileowner и использую UIScrollViewDelegate в .h-файле ViewController, а также реализую метод scrollViewDidScroll в .m-файле.

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

Есть какие-нибудь решения для этого?

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

Ответы [ 3 ]

13 голосов
/ 09 декабря 2011

Я столкнулся с той же проблемой при создании подкласса 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, View Controller должен нести ответственность за обработку тех, на мой взгляд.

4 голосов
/ 15 апреля 2011

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

2 голосов
/ 16 июня 2017

Если кто-то ищет ответ Swift 3, это так просто:

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