2014-12-09 7 views
8

Ho una vista con un gesto pan e un UIPushBehavior collegato ad esso e volevo sapere se è possibile controllare quando la vista è fuori dai limiti di supervisione. Fondamentalmente l'utente lancia la vista e voglio eseguire alcune animazioni quando la vista è fuori dallo schermo. Non riuscivo a capire come fare questo. Grazie.Come verificare se un UIView è fuori dai limiti della superview

risposta

8

Se si desidera controllare se è del tutto fuori di esso c'è limite Superview si può fare questo

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

Se si vuole verificare se solo una parte di esso è fuori dai limiti si può fare

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

appena provato questo e sembra che la sua sempre chiamato anche quando la vista è ancora nei limiti del superview:/ – mlevi

+0

Se aiutare quello che sto facendo è basata al di fuori di questo tutorial: http://www.raywenderlich.com/71828/uikit-dynamics-tutorial-tossing-views – mlevi

+0

Fondamentalmente voglio fare le cose una volta che la vista è fuori dallo schermo – mlevi

1

In 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. 
    } 

    if (v1.bounds.intersection(v2.frame).width > 0) && (v1.bounds.intersection(v2.frame).height > 0) 
    { 
     //view is partially out of bounds 
    } 
1

Purtroppo, la risposta di Philipp in parte fuori controllo limiti non è completamente corretto in questa riga: v1.bounds.intersection(v2.frame).width > 0) && (v1.bounds.intersection(v2.frame).height > 0

La dimensione dell'intersezione può essere maggiore di zero e la vista si troverebbe ancora all'interno dei limiti di superview.

Inoltre, non è possibile utilizzare equal(to: CGRect) in modo sicuro a causa della precisione di CGFloat.

Qui è corretto versione:

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 
} 
Problemi correlati