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

@interface

- (BOOL)isDisplayedInScreen;

@end

 

@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;

  }

  retrun true;

}

 

 

@end

 

 

 

//test case

UIView *view = [UIView alloc] initWithFrame:CGRectMake(0,0,40,40)];

//无父视图

BOOL b1 = [view isDisplayedInScreen];

NSLog(@"b1: %d", b1);

 

[self.view addSubView:view];

BOOL b2 = [view isDisplayedInScreen];

NSLog(@"b2:%d",b2);

v.frame = CGRectZero;

BOOL b3 = [view isDisplayedSceen];

NSLog("b3:%d",b3);

 

CGRect screenRect  = [UIScreen mainScreen].bounds;

CGFloat screenWidth = screenRect.size.width;

CGFloat screenHeight = screenRect.size.height;

 

view.frame = CGRectMake(-screenWidth, -screenHeight, screenWidth, screenHeight);

BOOL b4 = [view isDisplayedInscreen];

NSLog(@"b4:%d",b4);

 

posted @   wjwdive  阅读(9317)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示