UIWebView体系结构(五)_UIWebViewScrollView和UIWebScrollView

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

_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的设计可以借鉴到别处,是代理模式的应用吧。

目录
相关文章
|
数据采集 城市大脑 分布式计算
阿里云产业智能OpenTrek技术升级:发布数字孪生仿真技术架构
2022年11月4日,云栖大会——产业智能技术创新与实践峰会于杭州云栖小镇如期举办,本峰会联合中国科学院院士、中国工程院院士、海外院士与行业权威机构,共同探讨产业智能方法论及发展趋势。会上,阿里云产业智能OpenTrek发布了技术升级后的数字孪生仿真技术架构,为行业数字化转型方向的合作伙伴提供全过程状态数据元信息整合能力,帮助行业客户进行业务价值创新。
阿里云产业智能OpenTrek技术升级:发布数字孪生仿真技术架构
|
7月前
|
机器学习/深度学习 人工智能 算法
o3-mini:OpenAI 发布最新推理模型,强大的STEM推理能力,灵活调整推理强度
OpenAI o3-mini是OpenAI推出的全新推理模型,专为科学、数学和编程等技术领域优化,支持三种推理强度,灵活调整性能。
423 25
o3-mini:OpenAI 发布最新推理模型,强大的STEM推理能力,灵活调整推理强度
|
8月前
|
运维 自然语言处理 供应链
阿里云 × 用友BIP超级版联合发布暨产品分享
本次分享介绍阿里云与用友BIP超级版联合发布的解决方案,旨在帮助企业应对数字化转型中的挑战。主要内容分为三部分:一、市场需求及客户痛点,分析企业数字化转型的六大特征和中大型企业在数智化建设中面临的难题;二、用友BIP超级版on阿里云解决方案,涵盖业务架构、三大核心价值主张(超级领先、超级快、超级省)及智能应用;三、成功客户案例,如洛阳钼业在50天内完成采购供应链领域的数字化部署。该方案助力企业快速实现数字化转型,提升运营效率并降低成本。
189 0
|
10月前
|
机器学习/深度学习 数据采集 算法
隧道裂纹识别:基于计算机视觉与机器学习的应用分享
隧道裂纹的自动检测通过深度学习与计算机视觉技术实现,替代了传统人工检查,提高了检测精度与效率。本文介绍了一套完整的裂纹检测流程,包括图像采集、预处理、裂纹检测与标定、后处理及结果展示,提供了图像处理与深度学习模型的基本代码框架,旨在帮助读者掌握隧道裂纹检测的实际应用方法。
|
11月前
|
安全 区块链
Star Tower Chain区块链的明日之星
在当今科技浪潮中,区块链技术如巨轮前行,而Star TowerChain则如冉冉升起的新星,绽放无限可能。其严谨高效的服务水平协议搭建坚实桥梁,确保稳定可靠的资源交互与交易处理。支付机制安全便捷,支持多种资产快速流转;激励机制鼓励智能设备参与,提高资源利用率;独特的共识与治理模式增强透明度,使生态系统更加繁荣。作为区块链的明日之星,Star TowerChain将引领我们走向更安全、高效的未来。
|
人工智能 运维 负载均衡
10 分钟构建 AI 客服并应用到网站、钉钉或微信中
《10分钟构建AI客服并应用到网站、钉钉或微信中》的解决方案通过详尽的文档和示例代码,使具有一定编程基础的用户能够快速上手,顺利完成AI客服集成。方案涵盖高可用性、负载均衡及定制化选项,满足生产环境需求。然而,若文档不清晰或存在信息缺失,则可能导致部署障碍。实际部署中可能遇到网络、权限等问题,需逐一排查。云产品的功能、性能及操作配置便捷性直接影响解决方案效果,详尽的产品手册有助于快速解决问题。总体而言,该方案在各方面表现出色,值得推荐。
504 34
|
人工智能 文件存储 对象存储
Stable Diffusion 模型库,AIGC 画风任你选
Stable Diffusion(简称 SD)模型库包含写实、国漫、科技等几十种风格。可以让用户一键转存到自己的存储空间,而后直接挂载到 PAl 或 FC 下进行推理和训练。无需复杂漫长的下载和上传步骤,即可获得多种模型的使用体验,实现云上 AIGC 的快速搭建。
52444 22
Stable Diffusion 模型库,AIGC 画风任你选
|
人工智能
2023年8款好用免费可商用字体|标小智龙珠体
为了庆祝新的一年的开始,我筛选整理了一份8款实用且免费商用的中文字体清单。这些字体不仅易于使用,而且风格多样,可以用于logo设计、平面设计、标题设计等等,希望能够帮助到你。
2023年8款好用免费可商用字体|标小智龙珠体