在我的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
不确定我的举动是什么。
答案 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 x
和y
的C结构。所以简单地
aContentOffset.x
aContentOffset.y
因为你是UIScrollView
的子类,你也有contentoffset
属性,只是说。