iOS判断UIView是否显示在屏幕上

来源:互联网 发布:win7网络组件修复工具 编辑:程序博客网 时间:2024/05/30 05:25

头文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

 
 
@interfaceUIView (UIScreenDisplaying)
 
// 判断View是否显示在屏幕上
- (BOOL)isDisplayedInScreen;
 
@end

实现文件

?
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
/*****************************************************
 *  MIT Licence
 *  
 *  Author: __承_影__
 *
 *  Date:   2015.2.10
 *
 ****************************************************/
 
@implementationUIView (UIScreenDisplaying)
 
// 判断View是否显示在屏幕上
- (BOOL)isDisplayedInScreen
{
    if(self == nil) {
        returnFALSE;
    }
     
    CGRect screenRect = [UIScreen mainScreen].bounds;
     
    // 转换view对应window的Rect
    CGRect rect = [self convertRect:self.frame fromView:nil];
    if(CGRectIsEmpty(rect) || CGRectIsNull(rect)) {
        returnFALSE;
    }
     
    // 若view 隐藏
    if(self.hidden) {
        returnFALSE;
    }
     
    // 若没有superview
    if(self.superview == nil) {
        returnFALSE;
    }
     
    // 若size为CGrectZero
    if(CGSizeEqualToSize(rect.size, CGSizeZero)) {
        return FALSE;
    }
     
    // 获取 该view与window 交叉的 Rect
    CGRect intersectionRect = CGRectIntersection(rect, screenRect);
    if(CGRectIsEmpty(intersectionRect) || CGRectIsNull(intersectionRect)) {
        returnFALSE;
    }
     
    returnTRUE;
}

测试用例:

?
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
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0,0,40,40)];
 
// 无父视图
BOOL b1 = [v isDisplayedInScreen];
NSLog(@"b1: %d", b1);
 
 
//
[self.view addSubview:v];
 
BOOL b2 = [v isDisplayedInScreen];
NSLog(@"b2: %d", b2);
 
 
v.frame = CGRectZero;
BOOL b3 = [v isDisplayedInScreen];
NSLog(@"b3: %d", b3);
 
 
CGRect screenRect = [UIScreen mainScreen].bounds;
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;
 
v.frame = CGRectMake(-screenWidth, -screenHeight, screenWidth, screenHeight);
BOOL b4 = [v isDisplayedInScreen];
NSLog(@"b4: %d", b4);

0 0