Проверьте, находится ли UIView в видимом состоянии UIScrollView

Какой самый простой и элегантный способ проверить, является ли UIView видимым в текущем UIScrollView contentView? Есть два способа сделать это, один включает в себя положение contentOffset.y UIScrollView, а другим способом является преобразование прямоугольной области?

Ответы

Ответ 1

Если вы пытаетесь сработать, если на экране было прокручено изображение, попробуйте следующее:

    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
    }

Ответ 2

Внесите scrollViewDidScroll: в свой делегат просмотра прокрутки и вычислите вручную, какие виды видны (например, если проверка CGRectIntersectsRect(scrollView.bounds, subview.frame) возвращает true.

Ответ 3

Swift 5: в случае, если вы хотите вызвать событие, которое проверяет, что весь UIView виден в представлении прокрутки:

extension ViewController: UIScrollViewDelegate {

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

}

Ответ 4

Я думаю, что ваши идеи верны. если бы это был я, я бы сделал это следующим образом:

//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
}

Ответ 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
    }