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

转载 请注明出处:ALDRIDGE1的专栏

头文件:

/*****************************************************
 *  MIT Licence
 *  
 *  Author: __承_影__
 *
 *  Date:   2015.2.10
 *
 ****************************************************/

@interface UIView (UIScreenDisplaying)

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

@end

实现文件

/*****************************************************
 *  MIT Licence
 *  
 *  Author: __承_影__
 *
 *  Date:   2015.2.10
 *
 ****************************************************/

@implementation UIView (UIScreenDisplaying)

// 判断View是否显示在屏幕上
- (BOOL)isDisplayedInScreen
{
    if (self == nil) {
        return FALSE;
    }

    CGRect screenRect = [UIScreen mainScreen].bounds;

    // 转换view对应window的Rect
    CGRect rect = [self convertRect:self.frame fromView:nil];
    if (CGRectIsEmpty(rect) || CGRectIsNull(rect)) {
        return FALSE;
    }

    // 若view 隐藏
    if (self.hidden) {
        return FALSE;
    }

    // 若没有superview
    if (self.superview == nil) {
        return FALSE;
    }

    // 若size为CGrectZero
    if (CGSizeEqualToSize(rect.size, CGSizeZero)) {
        return  FALSE;
    }

    // 获取 该view与window 交叉的 Rect
    CGRect intersectionRect = CGRectIntersection(rect, screenRect);
    if (CGRectIsEmpty(intersectionRect) || CGRectIsNull(intersectionRect)) {
        return FALSE;
    }

    return TRUE;
}

测试用例:

    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);
时间: 2024-11-11 14:41:30

iOS判断UIView是否显示在屏幕上的相关文章

iOS判断一个View是否显示在屏幕上

有时候做UI的时候,比如需要判断scrollView中一个btn是否显示在屏幕上,可以用以下代码: #pragma mark - 返回一个View所在的位置x,y,是否在rect坐标里面 - (BOOL)isInScreenView:(UIView *)inView withRect:(CGRect)rect{ return CGRectIntersectsRect(inView.frame, rect); } #pragma mark - 返回判断screenRect所在的位置x,y,是否在r

JAVA基础-输入输出:1.编写TextRw.java的Java应用程序,程序完成的功能是:首先向TextRw.txt中写入自己的学号和姓名,读取TextRw.txt中信息并将其显示在屏幕上。

1.编写TextRw.java的Java应用程序,程序完成的功能是:首先向TextRw.txt中写入自己的学号和姓名,读取TextRw.txt中信息并将其显示在屏幕上. package Test03; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOExceptio

编程题:功能:将5个学生记录输入文件d:\stu1.txt中,并且显示在屏幕上。

编程题:文件读写fprintf().fscanf()使用,功能:将5个学生记录输入文件d:\stu1.txt中,并且显示在屏幕上. #include<stdio.h> void main() { FILE *fp;long num;int n,score;char name[20]; int N=5; fp=fopen("d:\\s tu1.txt","w"); for(n=1;n<=N;n++) { scanf("%s%10ld%d&q

Linux more(功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上)

more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 .more命令从前向后读取文件,因此在启动时就加载整个文件. 1.命令格式: more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ] 2.命令功能: more命令和cat的功能一样都

C语言之文件操作——输出文本文件中的内容显示在屏幕上

//文本文件的输出 /* =============================================================== 题目:输出文本文件中的内容显示在屏幕上! =============================================================== */ #include<stdio.h> #include<string.h> void main() { FILE *fp; char ch; fp=fopen

iOS开发中获取视图在屏幕上显示的位置

在iOS开发中,我们会经常遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近.如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置.可是,如果按钮是在UITableView的cell上呢?随着UITableView的滚动,按钮可能在顶部,也可能在底部,还可能在中间,左侧.右侧都有可能,那么,这个时候,怎么去计算按钮所在的位置呢?如果按钮所在的UITabelView是在另外一个UIScrollView的一个cell上呢?如果外面再有

设置退出 vim 之后不将内容显示在屏幕上

使用 vim 查看文件,退出之后文件内容还是留在屏幕上干扰阅读,我们要把 terminal 的环境变量设置成 Xterm

函数fun的功能是将形参给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在屏幕上

#include <stdio.h> void fun(char *s, int a, double f) { /**********found**********/ FILE* fp;//定义文本文件类型 char ch; fp = fopen("file1.txt", "w"); fprintf(fp, "%s %d %f\n", s, a, f); fclose(fp); fp = fopen("file1.txt&q

Eclipse键盘输出文字,显示到屏幕上方法

方法1 /*标准的思路: * 分析: * 1.来源 * 键盘:System.in * 2.目的地 * 屏幕:System.out * 文件:FIle * 3.分别分析:源,目的地流的类型(字符,字节) * 源:字节流(输入流inputstream) * 目的:字节流(输出流outputstream) * 4.是否需要装饰? * BufferedReader * */ InputStream is=System.in;//字节流 Reader reader=new InputStreamReade