#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
}
}
}