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

Ios 如何正确观察scrollView子类的contentOffset属性?,ios,uiscrollview,key-value-observing,cgpoint,Ios,Uiscrollview,Key Value Observing,Cgpoint,在iOS应用程序中,我观察到scrollView子类的contentOffset属性的更改。我的观察者处理程序如下所示: - (void)observeContentOffsetHandler:(id)aContentOffset { NSLog(@"%@", aContentOffset); } -[MyScrollView observeContentOffsetHandler:] [Line 111] NSPoint: {296, 375} -[MyScrollView ob

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

- (void)observeContentOffsetHandler:(id)aContentOffset {

    NSLog(@"%@", aContentOffset);

}
-[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}
为了简单起见,我任意选择了方法的参数作为id

我的日志如下所示:

- (void)observeContentOffsetHandler:(id)aContentOffset {

    NSLog(@"%@", aContentOffset);

}
-[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转换成CG点,没有。我试过把参数改成CGPoint,没有

更新 它变得更深了@我没有快乐。以下是我如何设置观察:

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显示,所有零表示一个量程偏移:

-[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

不确定我在这里的动作是什么。

contentoffset
确实是一个
CGPoint
,它是一个带有
CGFloat
s
x
y
的C结构。这么简单

aContentOffset.x
aContentOffset.y

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

因为您有一个UIScrollView子类,所以您可以访问LayoutSubview
每次contentOffset更改时都会调用它

这是在变化发生时获得变化的“正确方式”。不要使用KVO 是的,contentOffset是一个CGPoint…除非你说的是NSScrollView…但即使这样,基本思想还是一样的

覆盖布局子视图…记住调用super


将您的ViewController注册为scrollView的代理,并实现scrollView:didScroll获得它。正确签名的方法是:

- (void)observeContentOffsetHandler:(NSValue *)aContentOffset
因此,检索CGPoint非常简单:

CGPoint pt = [aContentOffset CGPointValue];
干杯,

道格

不知道你所说的适当是什么意思。有人可能会认为,将布局子视图与UIView子类的基本用途无关的功能混为一谈是一种糟糕的设计。我的观察将发生在控制器中,从MVC的角度来看,它更有意义。只是说,“…我以为您想在子类中做一些与UI相关的事情,因此是LayoutSubView。您的viewController(管理scrollview的那个)应该是scrollview的委托,并实现scrollview:didScroll每次contentOffset更改时都会调用它:),而且它也不会破坏MVC。@AnimishH,过去我确实遵循了scrollview控制器处理scrollViewDelegate职责的流行方法。我现在很少这样做,让scrollView成为自己的委托。流行的方法倾向于用scrollView管理职责使控制器混乱,仔细检查scrollView完全能够处理这些职责,并且根本不涉及域逻辑。例如viewForZoomingInScrollView:在控制器中没有业务。这是视图管道代码,而不是域代码。
layoutSubViews
属于
UIScrollViewController
而不是
UIScrollView
。可能有人只想使用scrollview而不使用控制器,也就是说,因为它嵌入到简单的
UIViewController
的视图中。谢谢。我确实可以直接使用contentOffset,但是我所做的观察的语义是不同的。干杯。不起作用,因为CGPoint是标量而不是类。观察处理程序将类(id、NSValue*等)作为其参数。