Tengo una UIView, en la que he organizado UIButtons. Quiero encontrar las posiciones de esos UIButtons.
Soy consciente de que buttons.frame
me dará las posiciones, pero me dará posiciones solo con respecto a su supervisión inmediata.
¿Hay alguna forma de que podamos encontrar las posiciones de esos botones, con respecto a la supervista de supervista de UIButtons?
Por ejemplo, suponga que hay una UIView llamada "firstView".
Entonces, tengo otro UIView, "secondView". Esta "SecondView" es una subvista de "firstView".
Entonces tengo UIButton como una subvista en el "secondView".
->UIViewController.view
--->FirstView A
------->SecondView B
------------>Button
Ahora, ¿hay alguna forma de que podamos encontrar la posición de ese UIButton, con respecto a "firstView"?
Aunque no es específico del botón en la jerarquía como se me preguntó, encontré esto más fácil de visualizar y comprender:
Desde aquí: fuente original
ObjC:
Rápido:
fuente
Actualizado para Swift 3
fuente
Marco: (X, Y, ancho, alto).
Por lo tanto, el ancho y la altura no cambiarán incluso con la vista super-super. Puede obtener fácilmente X, Y de la siguiente manera.
fuente
Si hay varias vistas apiladas y no necesita (o desea) conocer las posibles vistas entre las vistas que le interesan, puede hacer esto:
donde
targetView
estaría el botón,baseView
sería elViewController.view
.Lo que esta función está tratando de hacer es lo siguiente:
Si
targetView
no tiene una supervista, se devuelve su coordenada actual.Si
targetView's
la supervista no es la vista base (es decir, hay otras vistas entre el botón yviewcontroller.view
), se recupera una coordenada convertida y se pasa a la siguientesuperview
.Continúa haciendo lo mismo a través de la pila de vistas que se mueven hacia baseView.
Una vez que llega al
baseView
, hace una última conversión y lo devuelve.Nota: no maneja una situación en la que
targetView
se coloca debajo debaseView
.fuente
Extensión UIView para convertir el marco de la subvista (inspirado en la respuesta de @Rexb).
fuente
Puede obtener fácilmente la vista super-super de la siguiente manera.
secondView -> [botón de supervista]
firstView -> [[botón de supervista] supervista]
Luego, puede obtener la posición del botón.
Puedes usar esto:
fuente