25

UIView が現在の UIScrollView の contentView に表示されているかどうかを確認する最も簡単でエレガントな方法は何ですか? これを行うには 2 つの方法があります。1 つは UIScrollView の contentOffset.y 位置を使用する方法で、もう 1 つは rect 領域を変換する方法です。

4

7 に答える 7

23

ビューが画面上でスクロールされているかどうかを調べたい場合は、次のことを試してください。

    CGRect thePosition =  myView.frame;
    CGRect container = CGRectMake(scrollView.contentOffset.x, scrollView.contentOffset.y, scrollView.frame.size.width, scrollView.frame.size.height);
    if(CGRectIntersectsRect(thePosition, container))
    {
        // This view has been scrolled on screen
    }
于 2013-07-23T09:48:22.083 に答える
8

scrollViewDidScroll:スクロール ビュー デリゲートに実装し、どのビューが表示されるかを手動で計算します (たとえば、 CGRectIntersectsRect(scrollView.bounds, subview.frame)true を返すかどうかを確認することによって)。

于 2012-06-04T19:25:49.023 に答える
2

あなたの考えは正しいと思います。それが私だったら、私は次のようにします:

//scrollView is the main scroll view
//mainview is scrollview.superview
//view is the view inside the scroll view

CGRect viewRect = view.frame;
CGRect mainRect = mainView.frame;

if(CGRectIntersectsRect(mainRect, viewRect))
{
    //view is visible
}
于 2012-06-04T19:25:10.163 に答える
0

インセットを考慮したソリューション

public extension UIScrollView {
    
    /// Returns `adjustedContentInset` on iOS >= 11 and `contentInset` on iOS < 11.
    var fullContentInsets: UIEdgeInsets {
        if #available(iOS 11.0, *) {
            return adjustedContentInset
        } else {
            return contentInset
        }
    }

    /// Visible content frame. Equal to bounds without insets.
    var visibleContentFrame: CGRect {
        bounds.inset(by: fullContentInsets)
    }
}

if scrollView.visibleContentFrame.contains(view) {
    // View is fully visible even if there are overlaying views
}
于 2021-11-19T00:36:00.937 に答える