forked from twitter-archive/twui
/
CALayer+TUIExtensions.m
55 lines (43 loc) · 1.41 KB
/
CALayer+TUIExtensions.m
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//
// CALayer+TUIExtensions.m
//
// Created by Josh Vera on 11/26/11.
// Copyright (c) 2011 Bitswift. All rights reserved.
//
#import "CALayer+TUIExtensions.h"
static CGRect convertAndClipRectFromSuperlayers (CGRect rect, CALayer *layer);
static CGRect convertAndClipRectFromSuperlayers (CGRect rect, CALayer *layer) {
CALayer *superlayer = layer.superlayer;
if (superlayer) {
rect = convertAndClipRectFromSuperlayers(rect, superlayer);
if (CGRectIsNull(rect))
return CGRectNull;
rect = [layer convertRect:rect fromLayer:superlayer];
}
if (layer.masksToBounds) {
rect = CGRectIntersection(rect, layer.visibleRect);
}
return rect;
}
@implementation CALayer (TUIExtensions)
- (CGRect)tui_convertAndClipRect:(CGRect)rect toLayer:(CALayer *)layer {
CALayer *clippingLayer = self.superlayer;
CALayer *lastLayer = self;
while (clippingLayer) {
if (lastLayer.masksToBounds) {
rect = CGRectIntersection(rect, lastLayer.visibleRect);
if (CGRectIsNull(rect))
return CGRectNull;
}
rect = [clippingLayer convertRect:rect fromLayer:lastLayer];
lastLayer = clippingLayer;
clippingLayer = clippingLayer.superlayer;
}
// 'rect' is in the coordinate system of the root layer, and has been
// clipped accordingly
return convertAndClipRectFromSuperlayers(rect, layer);
}
- (CGRect)tui_convertAndClipRect:(CGRect)rect fromLayer:(CALayer *)layer {
return [layer tui_convertAndClipRect:rect toLayer:self];
}
@end