6

在我的 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,不。我尝试将参数更改为 CGPoint,不。

更新

它变得更深。@mgold 不高兴。这是我设置观察的方式:

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

Observer 是我用来简化观察的一个方便的类。注意观察者回调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

不知道我在这里的举动是什么。

4

3 回答 3

6

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

- (void)observeContentOffsetHandler:(NSValue *)aContentOffset

CGPoint 的检索是微不足道的:

CGPoint pt = [aContentOffset CGPointValue];

干杯,
道格

于 2012-01-05T12:52:51.623 回答
2

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

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

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

或者

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

于 2012-01-04T19:52:58.377 回答
0

contentoffset确实是 a ,它是一个带有s和CGPoint的 C 结构体。如此简单CGFloatxy

aContentOffset.x
aContentOffset.y

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

于 2012-01-04T15:19:16.530 回答