Как правильно наблюдать свойство contentOffset моего подкласса scrollView? - PullRequest
6 голосов
/ 04 января 2012

В моем приложении для iOS я наблюдаю изменения в свойстве contentOffset моего подкласса scrollView. Мой обработчик наблюдателя выглядит так:

- (void)observeContentOffsetHandler:(id)aContentOffset {

    NSLog(@"%@", aContentOffset);

}

Я выбрал параметр для метода произвольно как id для простоты.

Мой NSLog'ging выглядит так:

-[MyScrollView observeContentOffsetHandler:] [Line 111] NSPoint: {296, 375}
-[MyScrollView observeContentOffsetHandler:] [Line 111] NSPoint: {296, 389}
-[MyScrollView observeContentOffsetHandler:] [Line 111] NSPoint: {295, 401}
-[MyScrollView observeContentOffsetHandler:] [Line 111] NSPoint: {291, 415}

Мне нужно использовать значения x и y, но я не знаю, как их получить. Я пытался привести идентификатор к CGPoint, нет. Я пытался изменить параметр на CGPoint, нет.

UPDATE

Это становится глубже. @mgold нет радости. Вот как я настроил наблюдение:

self.contentOffsetObserver = [[[Observer alloc] initWithTarget:self action:@selector(observeContentOffsetHandler:)] autorelease];
[self.myScrollViewSubclass addObserver:self.contentOffsetObserver forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:NULL];

Observer - это удобный класс, который я использую для облегчения наблюдения. Обратите внимание на обратный вызов наблюдателя наблюдающийКонтент_Обладателя: Когда я меняю сигнатуру этого метода с его текущего:

- (void)observeContentOffsetHandler:(id)aContentOffset

по предложению @ mgold CGPoint:

- (void)observeContentOffsetHandler:(CGPoint)aContentOffset

Это неверно, поскольку NSLog показывает все нули для aContentOffset:

-[MyScrollController observeContentOffsetHandler:] [Line 74] aContentOffset 0 0
-[MyScrollController observeContentOffsetHandler:] [Line 74] aContentOffset 0 0
-[MyScrollController observeContentOffsetHandler:] [Line 74] aContentOffset 0 0
-[MyScrollController observeContentOffsetHandler:] [Line 74] aContentOffset 0 0

Не уверен, что мой ход здесь.

Ответы [ 3 ]

6 голосов
/ 05 января 2012

Понял.Правильная подпись метода:

- (void)observeContentOffsetHandler:(NSValue *)aContentOffset

Извлечение CGPoint в таком случае тривиально:

CGPoint pt = [aContentOffset CGPointValue];

Приветствия,
Дуг

2 голосов
/ 04 января 2012

Поскольку у вас есть подкласс UIScrollView, у вас есть доступ к layoutSubViews
Он вызывается каждый раз, когда изменяется contentOffset.

Это «правильный способ» получить изменения по мере их возникновения. Не используйте КВО Да, contentOffset - это CGPoint .... если только вы не говорили о NSScrollView ..... но даже тогда основная идея остается прежней.

Переопределить layoutSubviews .... не забудьте назвать super

ИЛИ

зарегистрируйте свой ViewController как делегат scrollView и реализуйте scrollView: didScroll

0 голосов
/ 04 января 2012

contentoffset действительно является CGPoint, который является структурой C с CGFloat s x и y.Так просто

aContentOffset.x
aContentOffset.y

Поскольку вы создаете подкласс UIScrollView, у вас также есть свойство contentoffset, просто говоря.

...