How do I properly observe the contentOffset property of my scrollView subclass?

大城市里の小女人 提交于 2020-01-13 09:21:14

问题


In my iOS app I am observing changes to the contentOffset property of my scrollView subclass. My observer handler looks like this:

- (void)observeContentOffsetHandler:(id)aContentOffset {

    NSLog(@"%@", aContentOffset);

}

I chose the parameter to the method arbitrarily as an id for simplicity.

My NSLog'ging looks like this:

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

I need to use the x and y values but I have no idea how to get at them. I've tried casting the id to a CGPoint, nope. I've tried changing the param to a CGPoint, nope.

UPDATE

It gets deeper. @mgold no joy. Here is how I set up observation:

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

Observer is a handy class I use to make observation easy. Note the observer callback observeContentOffsetHandler:. When I change the signature of this method from its current:

- (void)observeContentOffsetHandler:(id)aContentOffset

to @mgold's suggestion of CGPoint:

- (void)observeContentOffsetHandler:(CGPoint)aContentOffset

It is incorrect as NSLog shows with all zeros for 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

Not sure what my move here is.


回答1:


Got it. The method correct signature is:

- (void)observeContentOffsetHandler:(NSValue *)aContentOffset

Retrieval of the CGPoint is then trivial:

CGPoint pt = [aContentOffset CGPointValue];

Cheers,
Doug




回答2:


Since you have a UIScrollView subclass, you have access to layoutSubViews
It is called every time contentOffset changes.

That is the "proper way" to get the changes as they happen. Don't use KVO Yes contentOffset is a CGPoint....unless you were talking about NSScrollView.....but even then the basic idea stays same.

Override layoutSubviews....remember to call super

OR

register your ViewController as delegate of the scrollView and implement scrollView:didScroll




回答3:


contentoffset is indeed a CGPoint, which is a C struct with CGFloats x and y. So simply

aContentOffset.x
aContentOffset.y

Because you are subclassing UIScrollView, you also have the contentoffset property, just saying.



来源:https://stackoverflow.com/questions/8729134/how-do-i-properly-observe-the-contentoffset-property-of-my-scrollview-subclass

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!