介绍

这篇文章深入研讨了一下UIScrollView中涉及到的一些交互特征,并给出了完毕一个自定义ScrollView的办法和Demo。以防咱们被问到比如“怎样完毕一个自定义UIScrollView”这样的问题有时会摸不着头脑,不知道发问者想考什么。即使你有app store十足的掌握spring是什么意思完美答复这apple id个问题,也不妨看一遍本文,这apple id暗码重置儿的定论或许会帮忙你弥补一些细节。

Demo:

这儿供应了Demo,来更好的表达一些必要的内容:LNCustomScrollView

这个Demo没有供应Pod支撑,只做学习运用。

contentOffset的实质

(Boundsspringcloud.x,bounds.y)符号了一个UIView的悉数子元素依托的参看系原点,假定这个点被符号被{-100, -100.f},那么这个视图的悉数子视图都会依据(-100, -100)这个点开始制造。例如,这spring种状况下,一个frame = {20.f,20.f,100.fspring面试题,100.f} 的子视图 会从(-80.f, -80.f)面试问题大全及答案大全开始制造,程序员怎样学所以,你只能看到这个子元素右下角的一小部分;在UIScrollView中,bounds.x 和 bounds.y 被独立出来,叫做contentOffset,只需不断改动contentOffset(bounds),就能做出可翻滚的效果。

射击很简略,但瞄准很难”,完毕一个U梯度下降法原理IScrollView并不只是spring是什么意思setContentOffset这样简略的事,假定咱们稍加考apple pay虑,就会意识到设springmvc的作业原理置成apple pay多少、什么时刻设梯度下降法matlab置这种问题并不是立刻就能想出来的。

咱们总结一下在setContentOffset或许需求考虑的繁琐问题:

  1. panGesture收效的时分,这个时分UIScrollView一般要移动相同的方位和方向。梯度下降公式
  2. panGesture完毕后,有速度仍然收效,在之后的一段时刻里要持续进行减速面试技巧和注意事项
  3. panGesture完毕后,contentOffset超出了ContentSize,在之后的一段时刻里需求康复到非拉伸状况。
  4. (2梯度下降算法推导)和(3)结合起来,panGesture完毕后,有速度仍然收效,在之后面试毛遂自荐范文的一段时刻内减速,减速到一半时突然触及了间隔面试技巧和注意事项,开始进行bounces,最后回弹到非拉伸状况。
  5. 在set时确保x、y两个spring方向上的运动独立运转。
  6. 在超越间隔进行panGestures时,pan转化为contentOffsapp storeet的比率较小,而未超越间隔时,比率为1:1。

假定咱们只在panGesture收效期间setContentOffset,这样做出来的效果和在屏幕上画一个能够跟手的View别无二致,这种不能称之为“ScrollView”,而更像是”followView”。

为了搞清楚这些问题,=在写自己的springbootScrollView之前,需求研讨一下原生的UIScrospring是什么意思llView是怎样作业的;即使运用UIDynami面试常见问题及答复技巧capp store 或 POP 来完毕,有些问题仍然需求研讨,例如:咱们怎样确保在放一个Spring在间隔时不发生简谐振动?又怎样确保不管以大的力仍是小的力冲击到间隔梯度下降算法推导时都不会荡来荡去,而当咱们真正将这些研讨透彻之后,自己做动画比运用库抵达的效果更志向,因为过于真实的物理引擎会让一些交互变得又臭又长,咱们需求当令取舍来抵达更佳的手感。

UIScrol梯度下降法例题lView中的运动规矩

UIScrollViapple storeew涉及到的运动规矩有两个:

  • decelerate:手指拖面试动UIScrollView后,UIScrollView自动翻滚的减速进程。
  • bounces:UIScrollView触碰间隔面试技巧后的回弹。

(还有一个是pan手势的间隔位移转化率,这个在Demo中有所完毕,但在这儿暂时不议论)。

Decelerate:

现象

咱们能够经过ScrollViewDidScroll署理不断打印出UIScrollView梯度下降公式的contentOffset,来追寻这个进程,在EndDragging开始记载,EndDecelerate完毕记载面试问题大全及答案大全。但UIScrollView给出了一个更直接的署理来获取这些信息:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrspringmvc的作业原理ollView withVelocity:(CGPoint)ve梯度下降算法推导locity targetContentOffset:(inout CGPoint *)targetContentOffset
{
NSLog(@"减速速度核算:%lf", velocity.y);
NSLog(@"减速间隔核算:%lf", targetContentOffset->y - scrollView.面试问题contentOffs梯度下降法例题e面试毛遂自荐一分钟t.y);
}

你能够不断查验翻滚一个UIScrollView,并打印相同方向上的velocity和 (target面试技巧Offset – currentOffset),在无限间隔的状况下,这个署理会给出pan手势完毕后的翻滚速梯度下降算法推导度和减速完毕后预测的方位,像上面这样。大部分状况下你会的到相似这样的一组效果(v是速度,y是从这个速度开始减速知道间断移动的间隔):

  • v: 5.0270956 y: 2506.5
  • v: 1.802126 y: 895springmvc的作业原理.0
  • v: 1.412374 y: 700.5
  • v: 1.687861 y: 838.0

查询一下,发现这些数值大约满足这个算式:

(v * 1000.f)/2.f ~= y

在Demo中,有个DecelerateObservation,现已写好了这些,能够下载Demo并查验在不磕碰到间隔的时分查程序员询控制台打印出的数值。为了便利程序员薪酬一般多少感遭到ScrollView的运动,我用相等巨细格子的UICollectionView替代UIScrollView程序员需求什么学历,这不会影响效果,UIColle面试技巧和注意事项ctionView便是UIScr面试毛遂自荐简略大方ollView的子类。

现象剖析

咱们需求寻觅一种满足如下联络的减速运动:从开始减速到减速完毕运动的总间隔总是减速开始速度的梯度下降算法的正确过程一半。
(先疏忽这个1000,它或许只是核算单位的不同,相似 pt/s 或 pt/ms)

反过来了解一下这个运动会比较便利:一个物体从静止开始加快到任意的v时,他们移动的间隔y总是那一时刻速度的一半。所以,有这些推导:

∵ v/2 = y,
∴ (v1 - 0)/2 = y1 - 0 ,程序员怎样学 (v2 - 0)/2 = y2 - 0,
∴ (v1 - v2)/2 = y1 - y2,
v = 2*y,
dv/dt = 2 dy/dt,
∴ a = 2v

面试技巧和注意事项v1和v2的时刻间隔无限小的时分(= dt)就变apple tv成了程序员那么心爱:a = 2v

这个意思是:速度越大,阻力越大,那么这个运动实践上便是咱们一般所说的阻尼运动 或 低速状况springboot常用注解下的空气阻力。

依据a、v联络能够持续推导一下 v、t联络:

dv/dt = - 2 * v
1/(2*v) dv = dt , 两端apple tv积分
(面试毛遂自荐简略大方1/面试2) * ln(v) = - t + C,
t = 0 时 v = v0, 得:
v = v0 *梯度下降算法推导 e^(-2*t)

指数上面的2程序员装逼代码便是咱们之前查询到的那个v、y的2倍联络,这个数越大减速到0需求的间隔越短,也就意味着减得更狠;这个数便是咱们常说的阻尼系数。

定论

所以:UIScro面试问题llView的减速运动便是阻尼系数为2的阻尼运动,apple pay 减速持续的间隔总是初始速度的一半。

  • Q:y与v的倍数联apple tv络为什么是约等于?
  • A:这个不是过错,应该是Ap梯度下降法原理和过程ple有意为之,因为阻尼减速是指数衰减,所以无限趋近于0的进程是非常漫长的,假定你看v/t的联络会发现,即便是Springt无限大,v都不会减为0,因为指数总是正的,所以为省掉后边那段很长很慢面试毛遂自荐简略大方的减速梯度下降算法思维,Apple就把它堵截了。 这个堵截量大约是 v = (12 ~ 13)pt/s , 小于这个速度就会被记为”不动了“,所以y总是比v/2小一点(6左右)。

Bounces:

Bounspring面试题ces动画欠好apple pay猜测,但咱们仍需以为它与绷簧是相关的梯度下降法原理和过程,在UIScrollView依托惯性冲击间隔时是在紧缩绷簧,康复到正常状况时将绷簧从紧缩状况康复到拉伸状况,差异app id注册是绷簧不会发生简谐振动。程序员

第一个猜测:

绷簧确实发生了简谐振动,但只完毕了正弦曲线的前半个周期,在此之后的振动在offset回归到0时就被强制取消了。
咱们经过记载一个UIScrollView依托惯性抵触到offset == 0的时刻spring 和 在本次抵触后回弹到offset == 0点 的时刻,取二者的差验梯度下降法原理证这个猜测的正确性。
咱们以不同抵触速度进行两次试验,假定这个猜测正确,两次抵触得到的时刻差应当是一起的。
绷簧简谐振动的周期是:T = 2 * PI * sqrt(k/m)
在绷簧的k和物体质量都不变的状况下,这个周期是一起的,明显抵触的力度不会改动这两个客观事物的特色。springmvc的作业原理

很怅惘,运用更大的惯性抵触间隔的回弹时刻总是大于运用较小惯性的回弹时刻;那么这个猜测就被证明是过错的了。

第二个猜测:

除了绷簧的力之外,还有额定的某些力也效果在了这个虚拟的物体上,让这个运动的前半程看起来像正弦相同,后半程又看起来像指数相同,这个效果应该spring框架就靠近了。

有了上面decelerate的履历,咱们非常清楚给一个运动曲线添加指数梯度下降公式衰减特性的办法便是加一个阻尼。所以,咱们查验为这个简谐运动添加面试毛遂自荐3分钟通用一个额定阻尼,那么UIScrollView冲击间隔时的运动方程变成:

k * y - C * v = m * a
k:劲度系数
C:阻尼系数
m:质量
a:加快度
y:间隔弹面试毛遂自荐3分钟通用簧平衡点的间隔

对这个方程稍作化简:

a + (C/m)*v + (k梯度下降算法思维/m)*y = 0

咱们一般以为v是y对时刻的求导,a梯度下降算法思维是v对时刻的求导,也便是y的二阶导,所以这个算式变成:

y'' + (C/m)*y' + (k/m) * y =面试常见问题及答复技巧 0

C、m、k均为常数,咱们做如梯度下降公式下替换以便利核算,令:

(C/m)/2 = ;
sqrt(k/apple官网m) = ;

这个方程变成:

y'' + 2**y' + ^2 = 0;

特征根方程:

^2 + 2apple官网** + ^2 = 0;
 = 4*^2 - 4*^2;

状况1: > 0

面试毛遂自荐3分钟通用对相异实根,需求 > ,(阻尼相对弹性较大)
过阻尼
程序员的直觉告诉我苹果不会用过阻尼运动影响用户手感,假定能够,苹果必定不会让UIScrollView慢悠悠地回复到原本的状况。

状况2: < 0

一对共轭复根,需求 > ,(阻尼相对弹性较小)
弱阻尼,得到的根是这种办法:e^(t) * (cos(t) + sin(*t))
画出来是指数包络的弦类曲线。
振幅会不断springboot减小,但周期不变。

状况3: = 0

一对相等实根,需求spring框架 =
临界阻尼
哦!我的天主,瞧瞧这优异的姓名!
这种阻尼能够让UIScrollView以最快的速度回复到平衡状况,又不至于在那里荡来荡去;临界阻尼被广泛应用在各种减震体系中。

临界阻尼条件: = ;此时,齐次方程通解: y = (C1 + C2t)e^(t);
凭仗一些条件省梯度下降法原理去一些参数:阻尼震动开始时,咱们以为是of面试毛遂自荐fset.y 刚初程序员计算器步变负的时分,所以:t = 0 时, y = 0; 得到 C1 = 0;spring面试题这个联络变成了:

y = A * t * e ^ (-*t);

(C2换成了A,也是常数)

需求额定供认的两个参数: A 和 , 来源于 阻尼系数,所以是个定程序员是学什么专业值。
把C2换成A能够让这个常数看起来更像是”振幅面试毛遂自荐3分钟通用“或是与之相似的某些参数,明显A是与本次抵触的力度相关的:撞得越狠,这个函数能抵达的最大程序员怎样学值也就越大,A越大。

参数观测办法:

因为存在A、两个待定系数,而咱们能观测到的数值主要是conten程序员tOffset,也便是位移,A、 的影响要素明显是速度、加快度这种更高等级的参数,经过查询位移供认A、难度较高,所以在这儿咱们运用一种简略的优化程序员需求什么学历办法来让这条曲线与实践值不断趋近面试

梯度下降法思路:

  1. 给定一组UIScrollView冲击间隔触发Bounces的真实数据集结S,S内包含Bounces动画期间内悉数的conte梯度下降算法思维ntOffset取值:[y0,y1程序员客栈, y2, y3…]。
  2. 给定一组待定系数的解(A、、),经过方程y = A * (t + ) * e ^ (-apple pay*(t + )) 核算出悉数的理论值[y0’,y1′, y2′, y3’…]。
  3. 核算出理论值与实践面试常见问题及答复技巧值的方差(这个方差函数实践上便是咱们要优化的政策函数),su程序员装逼代码m = (y0 – y0′)^2 + (y1 – y1′)^2 + (y2 – y2′)^2程序员需求什么学历 + (y3 – y3′)^2…
  4. 假定我让A、、中任意一个值,独自进行改动(例如:A + A / + / + ),能够让政策Spring函数的值变小,那么就对这个改动予以必定,梯度下降法原理和过程将原值修改为改动后的值。
  5. 对于三个待定springboot面试题系数,咱们有六个springmvc的作业原理方向进行改动,A+、A-、+、-、+、-,当这六中改动中有多种改动都能够让政策函数效果变小,那么咱们取变得最小的那个改程序员计算器动,因此这个办法也称为:最速下降法。
  6. 当政策函数被优化到0时,说明咱们的政策曲线与实践观测出的曲线现已彻底重合了,因为,但这只是志向状况,因为咱们机梯度下降法matlab器上观测到的数值总是离散面试毛遂自荐简略大方的,所以咱们以为这个数值被优化到个位数时就现已比较靠近了。

在Demo中,咱们给出了一个OptimizationDemo,apple store用来展梯度下降算法的正确过程现这个进程,这个Demo中给出了三组我自己从BouncesO面试技巧和注意事项ptimizatio程序员客栈n中截取的Bounces数据放在了三个数spring面试题组中,当你点击顶部梯度下降算法推导的Coapple id暗码重置llection的“数据1”、“数据2”时会选择一组数据,并在屏幕上制造这组数据的Bounces曲线(黑色);当你再点击start时,一个Trainer会将(A、app id注册、)从(0.f、0.f、0.f)开始优化,一起在屏幕上不面试毛遂自荐断制造一条优化曲线(赤色)。毕竟这两条曲线会重合在一起,并输出程序员培训班要多少钱毕竟的(A、、) 和 sum在本次优化完毕后的最优值。

在进行屡次优化后,咱们梯度下降法原理会发现值总是固定的,在10.8~10.9之间;所以这个值就被供认下来了,这个优化进程表现为:

iOS的UIScrollView交互特性

的值能够疏忽spring是什么意思,咱们给出的公式:y = A * t * e ^ (-*t) 总是以为这个运动开始时t = 0,但咱们实践取到Bounces的时分t一般是大于0的, 所以咱们要把前apple tv面那段遭到d梯度下降ecelerate影响的部分去掉,在有导spring是什么意思航栏的时分总是springboot常用注解取小于 -64 或 -88 的第一个数作为y0,在此之前的数值会遭到decelerate影响。

在Bounce梯度下降sObservation中,咱们没有运用ScrollViewDidScroll捕获位移,因为ScrollViewDidScrollView只会springboot在contentOffset发生改动时回调面试,这会导致Bounces快间断时一段时刻内比较靠近的capple storeontentOffset只回调一次,例如这段时刻内本该是:[99.8、99.9、100.0、100.1、100.2], 因为机器程序员计算器依据像素点取整回调,所以只会回调一次100.0,这程序员培训班要多少钱对咱们的拟合会发生一些烦扰,导致毕竟收敛不是很精确,所以咱们一起运用CADisplayLink捕获这些值。

A参数剖析:

因为apple tvA受冲击到间隔的初速度影响,这个值在每组数据中都不是固定的,springcloud咱们经过下面这些springboot代换找到它和冲击初速度之间的联络:

∵ F*t面试 = m*v梯度下降法例题
∴ ∫ kx dt + ∫ cv dt = m * (0 - v0)

x和v带入得:

A * ∫(一堆和e^(*t)相关的函数)dt = -v0

不必核算这个积分,看出A和V0线性相关就能够:

k * A = v0

假定是线性联络的话,咱们只需找随机的一组先减速后冲击间隔的数据,算出刚好磕碰时的V0,再与这个A做比就能够求出这个系数k了(这个k不是上面那个劲度系数,程序员那么心爱便是随意的一个系数)。

例如,咱们有:松手时的速度v, 与间隔的间隔y,梯度下降得出的A。

那么,刚接触到间隔时的速度:

v0 = v - 2*y,
k = v0/A

就求出了这个份额系数,这个系数恰好是1。

其他数值:

劲度比:k/m ~= 119.f

阻尼比:C/m ~= 21.8f

Bo梯度下降法原理unces递推核算:

咱们经过CADisplayLink做Bounces动画时,需求每次做动画时的核算进程保持独立,也便是给定一个状况S0,咱们需求知道0.0167s后他的状况S1,从而在每次DisplayLink回调更新状况,来完毕这个动画。

这个状况包含两个元素:间隔间隔的位移y 、当时的速度v程序员客栈;咱们需求依据每次给定的{y、v}核算出整个公式的{A、t}, 然后将下一个状况的(t+t)带入公式,核算出新的{y1,v1},用新的状况更新当时的ScrollView,以此类推。

咱们查验对原公式做一下转化:

y = A*t*e^(-*t);     (1)
求导:v = A*e^(-*t) + A*t*(-)*e^(-*t) ;   (2)
两端相除:t = 1/((v/y) + )  (A)
t面试问题带入(1): A = y/(t * e^(-*t))  (B)

所以咱们能够经过效果1和效果2分别核算出t和A,再在t上做累加,核算下一个v、y。直到v满足小,小到咱们能够疏忽的程度,就能够完毕面试技巧和注意事项这个Bounces动画了。

Demo运用:

这个Demo中共包含了5个模块:

  • DecelerateObservation:用于查询阻尼减速的Demo。
  • BouncesObservation:用于查询间隔弹性的Demspring框架o,运用CADisplayLink捕获位移,捕获效果能够用来做趋近试验。
  • Optimization:用于做Bounces的式子的参数优化,供应了三组数据,梯度下降法也能够从控制台上拷app id注册贝BouncesObs程序员怎样学ervation输出的数据跑(除去导航栏的影响、除去Decelerate阶段的影响)。
  • GestureObservation:用于查询PanGesture在距springcloud五大组件离的有效位移转化率,拉伸得约明显,这个转化率越低,我估测这个位移转化率是指梯度下降法matlab数与线性函数的线性组合,相似:co程序员那么心爱nvertPercent = ay + be^-y。a代表了屈服程度、b代表了刚强程度,其Apple间屈服程度占12成,刚强程度占89成,但我暂时还没apple tv有办法彻底证明这种转化率是什么原理,所以不在这儿乱讲。
  • ScrollView:这个便是咱们运用上面这些原理制造出自定义ScrollView,上面提及的悉数交互分别在x、y两个方向上独立收效。

杂谈

经过这些议论,咱们现已意识到“自己制造一个UIScrollView”确实不是一件简略程序员装逼代码的事,“了解capple tvontentOffset”只是是其间的一点。所以,最好不要把这两个问题混为一谈。假定面试官运用前者向你发问,那你可要当心了,除了对iOS视图原面试常见问题及答复技巧理的一些了解外,他或许也想调查一些比较根底的知识。

假定有Android的同学需求完毕自己的Bounces或是Decelerate,也springcloud可稍微参看这儿得出的一些定论;一位做Android的伙伴告诉我Android的Bou程序员培训班要多少钱nces效果都是spring自己完毕的,并且一般需求依托两层视图,并趁便给我展示了一下米UI中翻滚列表的视图层级,我体会了一下米UI中设Spring置列表,假定能在间隔处拉伸的间隔转化上添加一些线性成分,个人感觉体会程序员是做什么的会更好一些。