UIWebView体系结构(五)_UIWebViewScrollView和UIWebScrollView

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

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

@interface UIWebScrollView : UIScrollView

- (void)didMoveToWindow;
- (BOOL)touchesShouldCancelInContentView:(id)arg1;

@end
@implementation UIWebScrollView

- (void)didMoveToWindow
{
    [super didMoveToWindow];
    if (!self.window)
    {
        SEL sel = @selector(scrollViewWasRemoved:);
        if ([super.delegate respondsToSelector:sel])
            objc_msgSend(super.delegate, sel, self);
    }
}

- (BOOL)touchesShouldCancelInContentView:(id)arg1
{
    return YES;
}

@end
@interface _UIWebViewScrollView : UIWebScrollView
{
    _UIWebViewScrollViewDelegateForwarder *_forwarder;
    BOOL _bouncesSetExplicitly;
    UIWebBrowserView *_browserView;
}

- (void)_setWebView:(id)arg1;
- (id)delegate;
- (void)setDelegate:(id)arg1;
- (void)setBouncesHorizontally:(BOOL)arg1;
- (void)setBouncesVertically:(BOOL)arg1;
- (void)setBounces:(BOOL)arg1;
- (void)_weaklySetBouncesHorizontally:(BOOL)arg1;
- (void)dealloc;
- (id)initWithFrame:(struct CGRect)arg1;

@end
@implementation _UIWebViewScrollView

- (void)_setWebView:(id)arg1
{
    [_forwarder setWebView:arg1];
    super.delegate = nil;
    super.delegate = _forwarder;
}

- (id)delegate
{
    return _forwarder.delegate;
}

- (void)setDelegate:(id)arg1
{
    _forwarder.delegate = arg1;
    super.delegate = nil;
    super.delegate = _forwarder;
}

- (void)setBouncesHorizontally:(BOOL)arg1
{
    [super setBouncesHorizontally:arg1];
    _bouncesSetExplicitly = YES;
}

- (void)setBouncesVertically:(BOOL)arg1
{
    [super setBouncesVertically:arg1];
    _bouncesSetExplicitly = YES;
}

- (void)setBounces:(BOOL)arg1
{
    [super setBounces:arg1];
    _bouncesSetExplicitly = YES;
}

- (void)_weaklySetBouncesHorizontally:(BOOL)arg1
{
    if (!_bouncesSetExplicitly)
        [super setBouncesHorizontally:arg1];
}

- (void)dealloc
{
    [_forwarder release];
    _forwarder = nil;
    [super dealloc];
}

- (id)initWithFrame:(struct CGRect)arg1
{
    self = [super initWithFrame:arg1];
    if (self)
    {
        _forwarder = [[_UIWebViewScrollViewDelegateForwarder alloc] init];
    }
    return self;
}

@end

UIWebScrollView比UIScrollView多做了两件事:

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

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

(UIWebScrollView有其它子类)

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

@interface _UIWebViewScrollViewDelegateForwarder : NSObject <UIScrollViewDelegate>
{
    id <UIScrollViewDelegate> _delegate;
    UIWebView *_webView;
}

@property(nonatomic) UIWebView *webView; // @synthesize webView=_webView;
@property(nonatomic) id <UIScrollViewDelegate> delegate; // @synthesize delegate=_delegate;
- (void)forwardInvocation:(id)arg1;
- (BOOL)respondsToSelector:(SEL)arg1;
- (id)methodSignatureForSelector:(SEL)arg1;

@end
@implementation _UIWebViewScrollViewDelegateForwarder

@synthesize webView=_webView;
@synthesize delegate=_delegate;

- (void)forwardInvocation:(NSInvocation*)arg1
{
    SEL sel = [arg1 selector];
    bool hasWebViewResponded = false;
    if ([_webView respondsToSelector:sel])
    {
        [arg1 invokeWithTarget:_webView];
        hasWebViewResponded = true;
    }
    if([_delegate respondsToSelector:sel])
    {
        [arg1 invokeWithTarget:_delegate];
    }
    else
    {
        if (!hasWebViewResponded)
        {
            [super forwardInvocation:arg1];
        }
    }
}

- (BOOL)respondsToSelector:(SEL)arg1
{
    bool result = [super respondsToSelector:arg1];
    if (!result)
    {
        result = [_webView respondsToSelector:arg1];
        if (!result)
        {
            result = [_delegate respondsToSelector:arg1];
        }
    }
    return result;
}

- (id)methodSignatureForSelector:(SEL)arg1
{
    id result = [super methodSignatureForSelector:arg1];
    if (!result)
    {
        result = [_webView methodSignatureForSelector:arg1];
        if (!result)
        {
            result = [(NSObject*)_delegate methodSignatureForSelector:arg1];
        }
    }
    return result;
}

@end

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

时间: 2024-10-09 03:20:59

UIWebView体系结构(五)_UIWebViewScrollView和UIWebScrollView的相关文章

UIWebView体系结构(六)UIWebView

UIWebView的实际成员变量都由UIWebViewInternal保存,UIWebViewInternal的声明如下: @interface UIWebViewInternal : NSObject { UIScrollView *scroller; UIWebBrowserView *browserView; UICheckeredPatternView *checkeredPatternView; id <UIWebViewDelegate> delegate; unsigned in

UIWebView体系结构(七)WebView

在<iOS WebCore的wak目录>中证实了iOS的WebKit是想尽可能复用Mac上的代码,所以WebView在iOS和Mac上差不多. Mac WebView的参考文档: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/WebKit/Classes/WebView_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40003822 当然,

UIWebView体系结构(三)UIWebDocumentView和WebView

WebView是UIWebDocumentView最重要的组合对象,先讲WebView吧. WebView的声明如下:(代码好长,点此跳过) @interface WebView : WAKView { WebViewPrivate *_private; } + (void)registerViewClass:(Class)arg1 representationClass:(Class)arg2 forMIMEType:(id)arg3; + (void)registerURLSchemeAsL

UIWebView体系结构(四)UIWebBrowserView

UIWebBrowserView的声明如下:(代码好长,点此跳过) @interface UIWebBrowserView : UIWebDocumentView <UIWebFormAccessoryDelegate, UIBrowserDocumentController, _UIWebRotationDelegate> { UIWebFormAccessory *_accessory; NSObject<UIFormPeripheral> *_input; DOMNode *

UIWebView体系结构(一)概貌

UIWebView属于UIKit,封装了WebKit.framework的WebView: WebView组合管理了WebCore.framework的Page,并提供了各种Clients: Page管理了Main Frame,Main Frame管理了sub Frame(FrameTree). UIWebView层(点击图片查看全图): WebView层(点击图片查看全图): Page层(未标明的关系为组合): Frame层(未标明的关系为组合): 转载请注明出处:http://blog.cs

Oracle 备份恢复概念

--====================== -- Oracle 备份恢复概念 --======================       数据库维护中,备份或恢复是重中之重的问题.尽管很多时候数据库系统运行缓慢,但对数据库数据的丢失而言,显然后者损失的代价是 不言而喻的.因此DBA至少在保证数据不丢失的情况下来提高系统的性能是最起码的要求.关于什么是备份与恢复,在此不做赘言.   一.物理备份与逻辑备份     物理备份         是所有物理文件的一个副本,比如数据文件,控制文件,

Objective-C头文件导出工具class-dump

首先,这个工具是开源的.作者网站:http://stevenygard.com/projects/class-dump/ 用途: 分析库文件或可执行文件,得到Objective-C类和部分C结构体的信息.常见使用场景是得到系统SDK的私有API.头文件的例子请参考<UIWebView体系结构(六)UIWebView> 原理: Objective-C类的信息会有字符串来对应描述,分析保存这些信息的区域,梳理成Objective-C头文件输出.请参见<IDA反汇编/反编译静态分析iOS模拟器

Oracle体系结构及备份(五) sga

一 什么是SGA SGA是一组为系统分配的共享的内存结构,可以包含一个数据库实例的数据或控制信 息.如果多个用户连接到同一个数据库实例,在实例的SGA中,数据可以被多个用户共享.当数据库实例启动 时,SGA的内存被自动分配:当数据库实例关闭时,SGA内存被回收. SGA是占用内存最大的一个区域,同时 也是影响数据库性能的重要因素. SGA区是可读写的.所有登录到实例的用户都能读取SGA中的信息,而在oracle做执行操作时,服务进程会 将修改的信息写入SGA区. SGA主要包括了以下的数据结构:

三层体系结构总结(五)

在这次项目开发中,我们对以前用的三层结构有进行了进一步的改变,除了使用Castle的Windsor容器来管理BLL层和DAL层,在数据的封装和对数据的读取上比以前更加面向对象. 1.              对于BLL层和DAL层的类型,分别继承各自的IBLL和IDAL,使用Windsor容器以注入的方式对其进行实例化,这一点和上次一样,不再赘述. 2.              对于Model层有了一些改进.每一个Model类型会对应一个ModelCollection集合类型,例如:对于订单