UIWebView体系结构(五)_UIWebViewScrollView和UIWebScrollView

来源:互联网 发布:34周b超数据判断男女 编辑:程序博客网 时间:2024/05/21 09:25

_UIWebViewScrollView的继承链为:_UIWebViewScrollView->UIWebScrollView->UIScrollView。

通过反编译可以得到实现。_UIWebViewScrollView和UIWebScrollView的实现为:(代码好长,点此跳过)

[cpp] view plaincopy
  1. @interface UIWebScrollView : UIScrollView  
  2.   
  3. - (void)didMoveToWindow;  
  4. - (BOOL)touchesShouldCancelInContentView:(id)arg1;  
  5.   
  6. @end  
[cpp] view plaincopy
  1. @implementation UIWebScrollView  
  2.   
  3. - (void)didMoveToWindow  
  4. {  
  5.     [super didMoveToWindow];  
  6.     if (!self.window)  
  7.     {  
  8.         SEL sel = @selector(scrollViewWasRemoved:);  
  9.         if ([super.delegate respondsToSelector:sel])  
  10.             objc_msgSend(super.delegate, sel, self);  
  11.     }  
  12. }  
  13.   
  14. - (BOOL)touchesShouldCancelInContentView:(id)arg1  
  15. {  
  16.     return YES;  
  17. }  
  18.   
  19. @end  

[cpp] view plaincopy
  1. @interface _UIWebViewScrollView : UIWebScrollView  
  2. {  
  3.     _UIWebViewScrollViewDelegateForwarder *_forwarder;  
  4.     BOOL _bouncesSetExplicitly;  
  5.     UIWebBrowserView *_browserView;  
  6. }  
  7.   
  8. - (void)_setWebView:(id)arg1;  
  9. - (id)delegate;  
  10. - (void)setDelegate:(id)arg1;  
  11. - (void)setBouncesHorizontally:(BOOL)arg1;  
  12. - (void)setBouncesVertically:(BOOL)arg1;  
  13. - (void)setBounces:(BOOL)arg1;  
  14. - (void)_weaklySetBouncesHorizontally:(BOOL)arg1;  
  15. - (void)dealloc;  
  16. - (id)initWithFrame:(struct CGRect)arg1;  
  17.   
  18. @end  

[cpp] view plaincopy
  1. @implementation _UIWebViewScrollView  
  2.   
  3. - (void)_setWebView:(id)arg1  
  4. {  
  5.     [_forwarder setWebView:arg1];  
  6.     super.delegate = nil;  
  7.     super.delegate = _forwarder;  
  8. }  
  9.   
  10. - (id)delegate  
  11. {  
  12.     return _forwarder.delegate;  
  13. }  
  14.   
  15. - (void)setDelegate:(id)arg1  
  16. {  
  17.     _forwarder.delegate = arg1;  
  18.     super.delegate = nil;  
  19.     super.delegate = _forwarder;  
  20. }  
  21.   
  22. - (void)setBouncesHorizontally:(BOOL)arg1  
  23. {  
  24.     [super setBouncesHorizontally:arg1];  
  25.     _bouncesSetExplicitly = YES;  
  26. }  
  27.   
  28. - (void)setBouncesVertically:(BOOL)arg1  
  29. {  
  30.     [super setBouncesVertically:arg1];  
  31.     _bouncesSetExplicitly = YES;  
  32. }  
  33.   
  34. - (void)setBounces:(BOOL)arg1  
  35. {  
  36.     [super setBounces:arg1];  
  37.     _bouncesSetExplicitly = YES;  
  38. }  
  39.   
  40. - (void)_weaklySetBouncesHorizontally:(BOOL)arg1  
  41. {  
  42.     if (!_bouncesSetExplicitly)  
  43.         [super setBouncesHorizontally:arg1];  
  44. }  
  45.   
  46. - (void)dealloc  
  47. {  
  48.     [_forwarder release];  
  49.     _forwarder = nil;  
  50.     [super dealloc];  
  51. }  
  52.   
  53. - (id)initWithFrame:(struct CGRect)arg1  
  54. {  
  55.     self = [super initWithFrame:arg1];  
  56.     if (self)  
  57.     {  
  58.         _forwarder = [[_UIWebViewScrollViewDelegateForwarder alloc] init];  
  59.     }  
  60.     return self;  
  61. }  
  62.   
  63. @end  

UIWebScrollView比UIScrollView多做了两件事:

  • 永远对contentView cancel touch
  • 通知delegate自己被移出window的view hierarchy

_UIWebViewScrollView比UIWebScrollView多做了一件事:记录是否被显式设置了Bounces属性。

(UIWebScrollView有其它子类)

_UIWebViewScrollViewDelegateForwarder的实现如下:(代码好长,点此跳过)

[cpp] view plaincopy
  1. @interface _UIWebViewScrollViewDelegateForwarder : NSObject <UIScrollViewDelegate>  
  2. {  
  3.     id <UIScrollViewDelegate> _delegate;  
  4.     UIWebView *_webView;  
  5. }  
  6.   
  7. @property(nonatomic) UIWebView *webView; // @synthesize webView=_webView;  
  8. @property(nonatomic) id <UIScrollViewDelegate> delegate; // @synthesize delegate=_delegate;  
  9. - (void)forwardInvocation:(id)arg1;  
  10. - (BOOL)respondsToSelector:(SEL)arg1;  
  11. - (id)methodSignatureForSelector:(SEL)arg1;  
  12.   
  13. @end  
[cpp] view plaincopy
  1. @implementation _UIWebViewScrollViewDelegateForwarder  
  2.   
  3. @synthesize webView=_webView;  
  4. @synthesize delegate=_delegate;  
  5.   
  6. - (void)forwardInvocation:(NSInvocation*)arg1  
  7. {  
  8.     SEL sel = [arg1 selector];  
  9.     bool hasWebViewResponded = false;  
  10.     if ([_webView respondsToSelector:sel])  
  11.     {  
  12.         [arg1 invokeWithTarget:_webView];  
  13.         hasWebViewResponded = true;  
  14.     }  
  15.     if([_delegate respondsToSelector:sel])  
  16.     {  
  17.         [arg1 invokeWithTarget:_delegate];  
  18.     }  
  19.     else  
  20.     {  
  21.         if (!hasWebViewResponded)  
  22.         {  
  23.             [super forwardInvocation:arg1];  
  24.         }  
  25.     }  
  26. }  
  27.   
  28. - (BOOL)respondsToSelector:(SEL)arg1  
  29. {  
  30.     bool result = [super respondsToSelector:arg1];  
  31.     if (!result)  
  32.     {  
  33.         result = [_webView respondsToSelector:arg1];  
  34.         if (!result)  
  35.         {  
  36.             result = [_delegate respondsToSelector:arg1];  
  37.         }  
  38.     }  
  39.     return result;  
  40. }  
  41.   
  42. - (id)methodSignatureForSelector:(SEL)arg1  
  43. {  
  44.     id result = [super methodSignatureForSelector:arg1];  
  45.     if (!result)  
  46.     {  
  47.         result = [_webView methodSignatureForSelector:arg1];  
  48.         if (!result)  
  49.         {  
  50.             result = [(NSObject*)_delegate methodSignatureForSelector:arg1];  
  51.         }  
  52.     }  
  53.     return result;  
  54. }  
  55.   
  56. @end  

_UIWebViewScrollViewDelegateForwarder所做的就是把传向_UIWebViewScrollView的消息转发给delegate。这个forwarder的设计可以借鉴到别处,是代理模式的应用吧。

原创粉丝点击