Detectar si UIView está cruzando otras UIViews.

Tengo un montón de UIViews en la pantalla. Me gustaría saber cuál es la mejor forma de verificar si una vista en particular (a la que me refiero) es la intersección de CUALQUIER otra vista. La forma en que lo estoy haciendo en este momento es recorrer iterando todas las subvistas y comprobar una a una si hay una intersección entre los cuadros.

Esto no parece muy eficiente. ¿Hay una mejor manera de hacer esto?

Primero, cree una matriz que almacene los frameworks de todas sus UIViews y su reference asociada.

Luego, potencialmente en un hilo de background, puede ejecutar algunas testings de colisión usando lo que hay en el array. Para algunas testings de colisión simples para rectangularjs solamente, eche un vistazo a esta pregunta de SO: Algoritmo de colisión simple para rectangularjs

¡Espero que ayude!

Hay una function llamada CGRectIntersectsRect que recibe dos CGRects como arguments y retorna si los dos rectos dados se cruzan. Y UIView tiene una propiedad de subarrendos que es un NSArray de objects UIView. Entonces puede escribir un método con el valor de retorno BOOL que recorrerá a través de este set y comprobará si se cruzan dos rectangularjs, como por ejemplo:

- (BOOL)viewIntersectsWithAnotherView:(UIView*)selectedView { NSArray *subViewsInView = [self.view subviews];// I assume self is a subclass // of UIViewController but the view can be //any UIView that'd act as a container //for all other views. for(UIView *theView in subViewsInView) { if (![selectedView isEqual:theView]) if(CGRectIntersectsRect(selectedView.frame, theView.frame)) return YES; } return NO; } 

Para lograr lo mismo de manera rápida según la respuesta aceptada, aquí está la function. Código de readymade. Solo copie y use de acuerdo con los pasos. Por cierto, estoy usando Xcode 7.2 con Swift 2.1.1.

 func checkViewIsInterSecting(viewToCheck: UIView) -> Bool{ let allSubViews = self.view!.subviews //Creating an array of all the subviews present in the superview. for viewS in allSubViews{ //Running the loop through the subviews array if (!(viewToCheck .isEqual(viewS))){ //Checking the view is equal to view to check or not if(CGRectIntersectsRect(viewToCheck.frame, viewS.frame)){ //Checking the view is intersecting with other or not return true //If intersected then return true } } } return false //If not intersected then return false } 

Ahora llame a esta function de la siguiente manera:

 let viewInterSected = self.checkViewIsInterSecting(newTwoPersonTable) //It will give the bool value as true/false. Now use this as per your need 

Gracias.

Espero que esto haya ayudado.