Как проверить, нет ли UIView вне границ его просмотра

У меня есть вид с жесты панорамы, и UIPushBehavior подключился к нему, чтобы узнать, можно ли его проверить, когда представление отключено. В основном пользователь бросает представление, и я хочу запустить некоторую анимацию, когда представление выходит из экрана. Не удалось выяснить, как это сделать. Спасибо.

Ответ 1

Если вы хотите проверить, полностью ли это из-за ограничений супервизора, вы можете сделать это

if (!CGRectContainsRect(view.superview.bounds, view.frame))
{
    //view is completely out of bounds of its super view.
}

Если вы хотите проверить, может ли только часть его выйти за пределы, вы можете сделать

if (!CGRectEqualToRect(CGRectIntersection(view.superview.bounds, view.frame), view.frame))
{
   //view is partially out of bounds
}

Ответ 2

К сожалению, ответ Филиппа на частичную проверку границ не совсем корректен в этой строке: v1.bounds.intersection(v2.frame).width > 0) && (v1.bounds.intersection(v2.frame).height > 0

Размер пересечения может быть больше нуля, и все же вид будет находиться внутри границ супервизора.

Также оказалось, что я не могу безопасно использовать equal(to: CGRect) из-за точности CGFloat.

Вот исправленная версия:

func outOfSuperviewBounds() -> Bool {
  guard let superview = self.superview else {
    return true
  }
  let intersectedFrame = superview.bounds.intersection(self.frame)
  let isInBounds = fabs(intersectedFrame.origin.x - self.frame.origin.x) < 1 &&
                   fabs(intersectedFrame.origin.y - self.frame.origin.y) < 1 &&
                   fabs(intersectedFrame.size.width - self.frame.size.width) < 1 &&
                   fabs(intersectedFrame.size.height - self.frame.size.height) < 1
  return !isInBounds
}

Ответ 3

EDIT
Как уже отмечалось, этот ответ не совсем правильный, пожалуйста, обратитесь к более голосуемому.

В Swift 3:

    let v1 = UIView()
    v1.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
    v1.backgroundColor = UIColor.red
    view.addSubview(v1)

    let v2 = UIView()
    v2.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
    v2.backgroundColor = UIColor.blue
    view.addSubview(v2)

    if (v1.bounds.contains(v2.frame))
    {
        //view is completely inside super view.
    }
    //this should be an or test
    if (v1.bounds.intersection(v2.frame).width > 0) || (v1.bounds.intersection(v2.frame).height > 0)
    {
        //view is partially out of bounds
    }