检查UIView是否处于UIScrollView可见状态

adi*_*dit 21 iphone objective-c ipad ios

检查UIView在当前UIScrollView的contentView上是否可见的最简单,最优雅的方法是什么?有两种方法可以做到这一点,一种是涉及UIScrollView的contentOffset.y位置,另一种方法是转换rect区域?

Mar*_*arc 20

如果您正在尝试计算屏幕上是否滚动了视图,请尝试以下操作:

    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
    }
Run Code Online (Sandbox Code Playgroud)


Jos*_*osé 9

Swift 5:如果您想触发一个事件,该事件检查整个UIView在滚动视图中是否可见:

extension ViewController: UIScrollViewDelegate {

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView.bounds.contains(targetView.frame) {
            // entire UIView is visible in scroll view
        }
    }

}
Run Code Online (Sandbox Code Playgroud)


Jit*_*ngh 8

scrollViewDidScroll:在滚动视图中实现委托并手动计算哪些视图是可见的(例如,通过检查是否CGRectIntersectsRect(scrollView.bounds, subview.frame)返回true).


小智 5

更新为 swift 3

var rect1: CGRect!
// initialize rect1 to the relevant subview
if rect1.frame.intersects(CGRect(origin: scrollView.contentOffset, size: scrollView.frame.size)) {
        // the view is visible
    }
Run Code Online (Sandbox Code Playgroud)


Oma*_*ith 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
}
Run Code Online (Sandbox Code Playgroud)