Pdf Can';t放大/缩小从webView子类化的类的滚动视图

Pdf Can';t放大/缩小从webView子类化的类的滚动视图,pdf,ios4,delegates,webview,scrollview,Pdf,Ios4,Delegates,Webview,Scrollview,我有一个类,它是webView的子类。当webView的scrollview缩放或滚动时,我需要做一些计算。webView中加载的内容是pdf文件。在iOS 5中,我通过以下方式获得scrollView: [super scrollView] 在iOS 4中: for (id subview in webView.subviews) if ([[subview class] isSubclassOfClass: [UIScrollView class]]) return subvi

我有一个类,它是
webView
的子类。当webView的
scrollview
缩放或滚动时,我需要做一些计算。webView中加载的内容是pdf文件。在iOS 5中,我通过以下方式获得scrollView:

[super scrollView]
在iOS 4中:

for (id subview in webView.subviews)
  if ([[subview class] isSubclassOfClass: [UIScrollView class]])
    return subview;
在iOS 5上工作正常,但在iOS 4中,当我更改scrollView的代理时,我无法再放大/缩小网络视图


有什么想法吗?如何更改该滚动视图的委托?

我实现了如下内容:

@interface ProxyScrollView : NSObject <UIScrollViewDelegate>
{
    UIScrollView* _view;
    id<UIScrollViewDelegate> origDelegate;
    id<UIScrollViewDelegate> newDelegate;
}

+ (ProxyScrollView*) proxyScrollViewWithScrollView: (UIScrollView*) scrollView;

@end

@implementation ProxyScrollView

- (id) initWithScrollView: (UIScrollView*) scrollView
{
    if(self != nil)
    {
        _view = scrollView;
        origDelegate = _view.delegate;
        [_view setDelegate:self];
        newDelegate = nil;
        [_view retain];

        return self;
    }

    return nil;
}

-(void)dealloc
{
    _view.delegate = origDelegate;
    [_view release];
    _view = nil;
    origDelegate = nil;
    newDelegate = nil;
}

+ (ProxyScrollView*) proxyScrollViewWithScrollView: (UIScrollView*) scrollView
{
    ProxyScrollView* retVal = [[[ProxyScrollView alloc] initWithScrollView:scrollView] autorelease];

    return retVal;
}

- (BOOL)isKindOfClass:(Class)aClass
{
    return [_view isKindOfClass:aClass];
}

- (BOOL)isMemberOfClass:(Class)aClass
{
    return [_view isMemberOfClass:aClass];
}

- (BOOL)respondsToSelector:(SEL)aSelector
{
    if ( [super respondsToSelector:aSelector] )
        return YES;
    else {
        /* Here, test whether the aSelector message can     *
         * be forwarded to another object and whether that  *
         * object can respond to it. Return YES if it can.  */
        if([_view respondsToSelector:aSelector])
            return YES;
    }
    return NO;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
    NSMethodSignature *sig = [super methodSignatureForSelector:sel];

    if(!sig)
    {
        sig = [_view methodSignatureForSelector:sel];
    }

    return sig;
}

- (void)forwardInvocation:(NSInvocation *)inv
{
    NSLog(@"inv.selector: %@", NSStringFromSelector(inv.selector));

    if([_view respondsToSelector: inv.selector])
    {
        [inv invokeWithTarget: _view];
    }
}

- (void)setDelegate:(id<UIScrollViewDelegate>)delegate
{
    newDelegate = delegate; 
}


- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if([origDelegate respondsToSelector:_cmd])
        [origDelegate performSelector:_cmd withObject:scrollView];
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate performSelector:_cmd withObject:scrollView];
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 
{
    if([origDelegate respondsToSelector:_cmd])
        [origDelegate performSelector:_cmd withObject:scrollView];
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate performSelector:_cmd withObject:scrollView];
}

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    if([origDelegate respondsToSelector:_cmd])
        [origDelegate performSelector:_cmd withObject:scrollView];
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate performSelector:_cmd withObject:scrollView];
}

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
    if([origDelegate respondsToSelector:_cmd])
        [origDelegate scrollViewWillEndDragging:scrollView withVelocity:velocity targetContentOffset:targetContentOffset];
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate scrollViewWillEndDragging:scrollView withVelocity:velocity targetContentOffset:targetContentOffset];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if([origDelegate respondsToSelector:_cmd])
        [origDelegate scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
}

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{
    if([origDelegate respondsToSelector:_cmd])
        [origDelegate performSelector:_cmd withObject:scrollView];
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate performSelector:_cmd withObject:scrollView];
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    if([origDelegate respondsToSelector:_cmd])
        [origDelegate performSelector:_cmd withObject:scrollView];
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate performSelector:_cmd withObject:scrollView];
}

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
    if([origDelegate respondsToSelector:_cmd])
        [origDelegate performSelector:_cmd withObject:scrollView];
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate performSelector:_cmd withObject:scrollView];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate performSelector:_cmd withObject:scrollView];
    if([origDelegate respondsToSelector:_cmd])
        return [origDelegate performSelector:_cmd withObject:scrollView];

    return nil;
}

- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_2)
{
    if([origDelegate respondsToSelector:_cmd])
        [origDelegate performSelector:_cmd withObject:scrollView withObject:view];
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate performSelector:_cmd withObject:scrollView withObject:view];
}

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
    if([origDelegate respondsToSelector:_cmd])
        [origDelegate scrollViewDidEndZooming:scrollView withView:view atScale:scale];
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate scrollViewDidEndZooming:scrollView withView:view atScale:scale];
}

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate scrollViewShouldScrollToTop:scrollView];
    if([origDelegate respondsToSelector:_cmd])
        return [origDelegate scrollViewShouldScrollToTop:scrollView];

    return false;
}

- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView
{
    if([origDelegate respondsToSelector:_cmd])
        [origDelegate performSelector:_cmd withObject:scrollView];
    if([newDelegate respondsToSelector:_cmd])
        [newDelegate performSelector:_cmd withObject:scrollView];
}

@end
在我的例子中,我为我的webView保留了一个singleton ProxyScrollView并返回它

for (id subview in webView.subviews)
  if ([[subview class] isSubclassOfClass: [UIScrollView class]])
    return [ProxyScrollView proxyScrollViewWithScrollView: (UIScrollView*) subview];