UIScrollView的底层实现原理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UIScrollView的底层实现原理相关的知识,希望对你有一定的参考价值。
参考技术A UIScrollView,是我们平时开发UI最常用的控件之一。并且我们常用的UITextView、UITableView、UICollectionView等等这些可滚动的控件,都是继承自UIScrollView来实现的。那么了解UIScrollView的滚动原理就十分必要了。从UIScrollView的官方文档,我们可以知道,UIScrollView本质就是一个contentView的原点(origin)可调节的UIView,它会根据手指的移动,来相应的调节origin的值。
说到这里,我们先了解一些,UIView的frame和bounds属性,及其区别。
而当我们更改frame和bounds的origin值时,会发生什么呢?
我们先创建三个view,分别是contentView、subView1、subView2。其中,subView1和subView2是contentView的两个子视图。其原始位置如下图:
我们来看一下修改subView1的bounds的origin,和subView2的frame的origin,如下图:
从图中,我们可以看到,subView2的frame的origin后,subView2的位置发生了改变,而修改subView1的bounds的origin的值,并不会影响subView1的位置。因为修改bounds的origin的值,改变的是subView1自身的坐标系,应该影响的是位于subView1自身的坐标系上的其子view。
那么,我们再修改contentView的bounds的origin的值,看看是否会影响contentView的子view的位置:
可以发现,通过contentView的bounds的origin,改变了其上子view的位置,看起来好像是将子view向下滚动了。
由此可以看出,UIScrollView滚动就是通过改变其contentView的bounds的origin的值,使得contentView上的子视图有了滚动的效果。
在触摸按下时,还会临时启动一个计时器,在计时器触发之前,看看触摸的手指是否有移动过。
如果计时器触发时,没有明显的位置改变,UIScrollView就会将事件传递给被触摸的子view。
如果计时器触发时,用户拖动手指足够远,UIScrollView就会取消给子view传递事件,并开始滚动。
Dubbo的底层实现原理和机制
参考技术A Dubbo :是一个rpc框架,soa框架作为RPC:支持各种传输协议,如dubbo,hession,json,fastjson,底层采用mina,netty长连接进行传输!典型的provider和cusomer模式!
作为SOA:具有服务治理功能,提供服务的注册和发现!用zookeeper实现注册中心!启动时候服务端会把所有接口注册到注册中心,并且订阅configurators,服务消费端订阅provide,configurators,routers,订阅变更时,zk会推送providers,configuators,routers,启动时注册长连接,进行通讯!proveider和provider启动后,后台启动定时器,发送统计数据到monitor!提供各种容错机制和负载均衡策略!!
描述一个服务从发布到被消费的详细过程:
一个服务的发布暴露过程:
首先设置一个项目的别名,然后是定义注册中心和设定传输协议,之后定义服务名!服务接口以jar形式导入到provider!
一个服务发布暴露首先由spring的spacehander 把相关的xml或者注解全部转化为springBean,之后通过ServiceConfig.exerp()方法把bean传化为传输所需的url和参数注册到注册中心,发布后provder端的ref(helloImpl)通过protocl(传输协议,如dubboprotocl,hessionprotocl)转化为Invoker对象,即调用信息,包括类,方法,参数等等,再通过proxy操作(代理)如jdkproxy代理转为为Exporter对象,这就是整个的服务暴露过程!
消费过程:
一个Renfence类,通过RenfenceConfig的init 调用proxy的refer方法生产一个invoker,invoker再通过proctol转化成具体的ref(hello),进行消费
首先 ReferenceConfig 类的 init 方法调用 Protocol 的 refer 方法生成 Invoker 实例(如上图中的红色部分),这是服务消费的关键。接下来把 Invoker 转换为客户端需要的接口(如:HelloWorld)
具体参见
http://dubbo.apache.org/#!/docs/dev/implementation.md?lang=zh-cn
Exporter接口提供Invoker的调用和destroy()
public interface Exporter<T>
#Dubbo的实现
Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export方法,它主要是打开socket侦听服务,并接收客户端发来的各种请求,通讯细节由Dubbo自己实现。
以上是关于UIScrollView的底层实现原理的主要内容,如果未能解决你的问题,请参考以下文章