如何正确观察我的scrollView子类的contentOffset属性?

时间:2012-01-04 15:13:11

标签: ios uiscrollview key-value-observing cgpoint

在我的iOS应用程序中,我观察到对scrollView子类的contentOffset属性的更改。我的观察者处理程序如下所示:

- (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值,但我不知道如何使用它们。我已经尝试将id转换为CGPoint,nope。我已经尝试将参数更改为CGPoint,nope。

更新

它变深了。 @mgold没有快乐。以下是我设置观察的方法:

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

观察者是一个方便的类我用来使观察变得容易。请注意观察者回调 observeContentOffsetHandler:。当我从当前的方法更改此方法的签名时:

- (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 个答案:

答案 0 :(得分:6)

知道了。方法正确的签名是:

- (void)observeContentOffsetHandler:(NSValue *)aContentOffset

CGPoint的检索是微不足道的:

CGPoint pt = [aContentOffset CGPointValue];

干杯,
道格

答案 1 :(得分:2)

由于您拥有UIScrollView子类,因此您可以访问layoutSubViews
每次contentOffset更改时都会调用它。

这是获得更改的“正确方法”。不要使用KVO 是的contentOffset是一个CGPoint ....除非你在谈论NSScrollView .....但即使这样,基本的想法也保持不变。

覆盖layoutSubviews ....记得调用super

OR

将您的ViewController注册为scrollView的委托,并实现scrollView:didScroll

答案 2 :(得分:0)

contentoffset确实是CGPoint,它是一个带有CGFloat s xy的C结构。所以简单地

aContentOffset.x
aContentOffset.y

因为你是UIScrollView的子类,你也有contentoffset属性,只是说。