我有一个UIViewController。根UIView包含一个自定义UIScrollView,用于在网格中显示缩略图图像(ThumbnailGrid类)。这个网格可以包含很多显示图像的UIViews(GridTile类)。因为有很多网格图块,用户可以向下滚动ThumbnailGrid。我只想加载用户实际可以看到的网格图块的图像,我不想为屏幕边缘的网格图块加载图像。
如何确定是否在屏幕上显示其中一个GridTile UIView?
我尝试了以下但是它似乎总是返回false。
- (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;
}
答案 0 :(得分: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;
}
答案 1 :(得分:0)
我知道它并没有直接回答你的问题,但仍然是:你为什么不使用UICollectionView
?它能够为您处理大部分重型部件。您不必关心它们在屏幕之外的那些。您只关心行为(委托)和内容(数据源)。
答案 2 :(得分:0)
老实说,我认为你是以错误的方式解决这个问题。有大量现有的框架正是为此而设计的。我不知道我是否会花时间手动推出自己的解决方案并处理所有内存和视图管理。看看这篇文章:Grid of images in iOS
答案 3 :(得分: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
&amp; -vw.frame.size.height
。
答案 4 :(得分:-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;
看看这是否有帮助