3

UIViewControllerがあります。ルートUIViewには、グリッドにサムネイル画像を表示するために使用しているカスタムUIScrollViewが含まれています(ThumbnailGridクラス)。このグリッドには、画像を表示する多くのUIViewを含めることができます(GridTileクラス)。グリッドタイルが非常に多いため、ユーザーはThumbnailGridを下にスクロールできます。ユーザーが実際に見ることができるグリッドタイルの画像のみをロードしたいのですが、画面の端から外れたグリッドタイルの画像はロードしたくありません。

これらのGridTileUIViewの1つが画面に表示されているかどうかを確認するにはどうすればよいですか?

私は以下を試しましたが、常に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;
}
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

私はそれがあなたの質問に直接答えないことを知っています、しかしそれでも:なぜあなたは?を使わないのですUICollectionViewか?それはあなたのために重い部品のほとんどを扱うことができます。画面の外にあるものを気にする必要はありません。動作(委任)とコンテンツ(データソース)だけを気にする必要があります。

于 2013-03-06T15:43:30.360 に答える
0

正直なところ、あなたはこれについて間違った方向に進んでいると思います。これを正確に行うように設計された既存のフレームワークはたくさんあります。自分のソリューションを手作業でロールし、すべてのメモリとビューの管理を処理するために時間を費やすかどうかはわかりません。この投稿をチェックしてください:iOSの画像のグリッド

于 2013-03-06T15:43:50.860 に答える
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 に答える
-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 に答える