3

我有一个 UIViewController。根 UIView 包含一个自定义 UIScrollView,我用于在网格中显示缩略图(ThumbnailGrid 类)。该网格可以包含许多显示图像的 UIView(GridTile 类)。因为有很多网格图块,用户可以向下滚动 ThumbnailGrid。我只想加载用户实际可以看到的网格图块的图像,我不想为屏幕边缘的网格图块加载图像。

如何确定这些 GridTile UIView 之一是否正在屏幕上显示?

我尝试了以下方法,但它似乎总是返回错误。

- (bool) isViewDisplayed:(UIView*)view
{
        CGRect viewFrame = view.frame;
        CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
        if (CGRectIntersectsRect(viewFrame, appFrame)) return true;
        return false;
}

我错过了什么吗?

提前感谢您的帮助!

编辑

解决方案

原来坐标系是错误的,所以我遇到了一些奇怪的情况,该方法应该返回 true,但它返回 false,反之亦然。

- (bool) isViewDisplated:(UIView*)view
{
    CGRect viewFrame = [parentOfView convertRect:view.frame toView:nil]; 
    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
    if (CGRectIntersectsRect(viewFrame, appFrame)) return true;
    return false;
}
4

5 回答 5

7

您还需要将 rect 转换为正确的坐标系:

- (bool)isViewDisplayed:(UIView*)view
{
    if (view.window) {
        CGRect viewFrame = [view.window convertRect:view.frame fromView:view.superview];
        CGRect screenFrame = view.window.bounds;
        return CGRectIntersectsRect(viewFrame, screenFrame);
    }
    return false;
}
于 2013-03-06T15:40:33.877 回答
0

你可以做一个这样的比较:

  NSMutableArray *outArray = [NSMutableArray array];
  NSMutableArray *inArray = [NSMutableArray array];


for (UIView *vw in rootView.subViews){
  if(vw.frame.origin.x <0 || vw.framew.origin.x >rootView.frame.size.width){
     [outArray addObject:vw];
  }else if(vw.frame.origin.y <0 || vw.framew.origin.y >rootView.frame.size.height){
     [outArray addObject:vw];
  }else{
     [inArray addObject:vw];
  }
}

所以最后你的 outArray 将包含所有部分/完全超出超级视图的视图,而 inArray 将包含所有完全在超级视图内的视图。如果您想使用方法(例如)检查单个视图 -(bool)isViewDisplayed:(UIView*)vw,则 for 循环中的相同代码就足够了,唯一的事情是您必须返回 true/false 而不是添加到数组

PS:如果您只想完全从超级视图中获取视图,那么不要将零检查与-vw.frame.size.width&进行比较-vw.frame.size.height

于 2013-03-06T15:46:17.660 回答
0

老实说,我认为你这样做是错误的。有大量现有的框架旨在做到这一点。我不知道我是否会花时间手动推出自己的解决方案并处理所有内存和视图管理。查看这篇文章:iOS 中的图像网格

于 2013-03-06T15:43:50.860 回答
0

我知道它不能直接回答你的问题,但仍然:你为什么不使用 a UICollectionView?它能够为您处理大部分重型部件。您不必关心它们在屏幕之外的那些。你只关心行为(委托)和内容(数据源)。

于 2013-03-06T15:43:30.360 回答
-4

使用标签很容易管理。像这样的东西

    UIView *view1 = [UIView]alloc]init];
view1.tag = 1;
[mainView addSubview:view1

];

并检查

UIView *temp = [mainView.view viewWithTag:1];
if(temp!=nil)return YES;
else NO;

看看这是否有帮助

于 2013-03-06T15:37:45.380 回答