iOS手势事件分发原理

HitTest的主要目的就是找到对于UIEvent的响应者,本文实现代码是根据apple文档描述的一种猜测实现,帮助大家理解原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- (UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event{

//apple文档描述,不接受事件的情况
if (self.userInteractionEnabled == NO || self.isHidden == YES || self.alpha < 0.01) {
return nil;
}

//如果当前View包含此Point
if ([self pointInside:point withEvent:event]) {

//遍历子View,这里注意要从后往前遍历,因为后面的是越靠近用户的
for (NSInteger i=self.subviews.count-1; i>=0; i--) {

UIView* subView = [self.subviews objectAtIndex:i];

//将父View的Point转换成子View坐标系的Point
CGPoint pointInSubView = [subView convertPoint:point fromView:self];

//递归子View调用HitTest:
UIView* resultView = [subView hitTest:pointInSubView withEvent:event];

//找到了子View可以响应
if (resultView) {
return resultView;
}

}

//没有找到可以响应的子View,返回自己
return self;
}

//返回nil,告诉上一级自己无法响应此事件
return nil;
}

阅读全文

纹理贴图

1 VertexShader

1
2
3
4
5
6
7
8
attribute vec2 TexCoordIn; // New
varying vec2 TexCoordOut; // New

void main(void) {
DestinationColor = SourceColor;
gl_Position = Projection * Modelview * Position;
TexCoordOut = TexCoordIn; // New
}

阅读全文

CALayer opaque

颜色合成公式

R = S + D * ( 1 – Sa )

20130819170332968

其中,R表示混合结果的颜色,S是源颜色(位于上层的红色图层一),D是目标颜色(位于下层的绿色图层二),Sa是源颜色的alpha值,即透明度。公式中所有的S和D颜色都假定已经预先乘以了他们的透明度。

设置opaque相当于是设置了Sa=1,此时R = S,省去了GPU的计算

注意:设置opaque为YES时,要确保alpha为1.0f,否则结果不可预期