检测UIWebView滚动视图的contentSize的更改 [英] detect changes to UIWebView's scroll view's contentSize

查看:128
本文介绍了检测UIWebView滚动视图的contentSize的更改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在UIScrollView内容的底部设置一个UIView,这样做我将视图的位置设置为scrollview的contentsize高度。但是我的scrollview是UIWebView的子视图,因此当加载图像时,内容大小会发生变化,我应该位于scrollview底部的视图最终位于中间......

I'm trying to set a UIView at the bottom of the content of a UIScrollView, do to so I set the view's position to the scrollview's contentsize height. But my scrollview is a subview of a UIWebView so when images are loaded, the contentsize height changes and my view which should be at the bottom of the scrollview ends up in the middle...

所以我正在寻找一种在scrollview的contentsize更改时得到通知的方法。我试图将其子类化并更改contentize的setter以发送NSNotification:

So I am looking for a way to be notified when the scrollview's contentsize changes. I've tried to subclass it and change the setter for contentsize to send a NSNotification:

@implementation UIScrollView (Height)

-(void)setContentSize:(CGSize)contentSize
{
    _contentSize=contentSize;
    [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"scrollViewContentSizeChanged" object:nil]];
}

@end

但是在编译时我得到了错误说:

But on compile I get and error saying:


_ OBJC_IVAR _ $ _ UIScrollView._contentSize,引自:
- [UIScrollView(Heigth)setContentSize:] in MyClass.o
ld:找不到架构armv7的符号

"_OBJC_IVAR_$_UIScrollView._contentSize", referenced from: -[UIScrollView(Heigth) setContentSize:] in MyClass.o ld: symbol(s) not found for architecture armv7

知道如何将setter子类化吗?

Any idea how the setter should be subclassed ?

谢谢!

推荐答案

也许你可以使用键值观察(KVO)检测内容大小的变化。我没有尝试过,但代码应如下所示:

Perhaps you can use key-value observing (KVO) to detect changes to the content size. I haven't tried it, but the code should look like this:

static int kObservingContentSizeChangesContext;

- (void)startObservingContentSizeChangesInWebView:(UIWebView *)webView {
    [webView.scrollView addObserver:self forKeyPath:@"contentSize" options:0 context:&kObservingContentSizeChangesContext];
}

- (void)stopObservingContentSizeChangesInWebView:(UIWebView *)webView {
    [webView.scrollView removeObserver:self forKeyPath:@"contentSize" context:&kObservingContentSizeChangesContext];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (context == &kObservingContentSizeChangesContext) {
        UIScrollView *scrollView = object;
        NSLog(@"%@ contentSize changed to %@", scrollView, NSStringFromCGSize(scrollView.contentSize));
    } else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

如果不起作用,您可能需要swizzle setContentSize:方法。方法调配让你的替换方法调用原始方法,这是你将新内容大小传递到滚动视图所需要做的。

If that doesn't work, you may need to swizzle the setContentSize: method. Method swizzling lets your replacement method call the original method, which is what you need to do to pass the new content size on to the scroll view.

你可以阅读更多关于方法在这里调整: http:// www.mikeash.com/pyblog/friday-qa-2010-01-29-method-replacement-for-fun-and-profit.html

You can read more about method swizzling here: http://www.mikeash.com/pyblog/friday-qa-2010-01-29-method-replacement-for-fun-and-profit.html

我认为这是最流行的混合代码: https://github.com/rentzsch/jrswizzle

I think this is the most popular code for swizzling: https://github.com/rentzsch/jrswizzle

这篇关于检测UIWebView滚动视图的contentSize的更改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆