Estoy tratando de entender las funcionalidades de estos métodos. ¿Podría proporcionarme un caso de uso simple para comprender su semántica?
De la documentación, por ejemplo, convertPoint: fromView: el método se describe de la siguiente manera:
Convierte un punto del sistema de coordenadas de una vista dada a la del receptor.
¿Qué significa el sistema de coordenadas ? ¿Qué hay del receptor ?
Por ejemplo, ¿tiene sentido usar convertPoint: fromView: como el siguiente?
CGPoint p = [view1 convertPoint:view1.center fromView:view1];
Usando la utilidad NSLog, he verificado que el valor p coincide con el centro de view1.
Gracias de antemano.
EDITAR: para aquellos interesados, he creado un fragmento de código simple para comprender estos métodos.
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 150, 200)];
view1.backgroundColor = [UIColor redColor];
NSLog(@"view1 frame: %@", NSStringFromCGRect(view1.frame));
NSLog(@"view1 center: %@", NSStringFromCGPoint(view1.center));
CGPoint originInWindowCoordinates = [self.window convertPoint:view1.bounds.origin fromView:view1];
NSLog(@"convertPoint:fromView: %@", NSStringFromCGPoint(originInWindowCoordinates));
CGPoint originInView1Coordinates = [self.window convertPoint:view1.frame.origin toView:view1];
NSLog(@"convertPoint:toView: %@", NSStringFromCGPoint(originInView1Coordinates));
En ambos casos, self.window es el receptor. Pero hay una diferencia. En el primer caso, el parámetro convertPoint se expresa en coordenadas view1. El resultado es el siguiente:
convertPoint: fromView: {100, 100}
En el segundo, en cambio, el convertPoint se expresa en coordenadas de supervista (self.window). El resultado es el siguiente:
convertPoint: toView: {0, 0}
convertPoint
yconvertRect
difieren en el tipo de devolución.CGPoint
oCGRect
. Pero ¿qué pasafrom
yto
? ¿Hay alguna regla general que pueda usar? Gracias.Siempre encuentro esto confuso, así que hice un parque infantil donde puedes explorar visualmente lo que hace la
convert
función. Esto se hace en Swift 3 y Xcode 8.1b:Recuerde mostrar el Editor Asistente ( ⎇⌘⏎) para ver las vistas, debería verse así:
Siéntase libre de contribuir con más ejemplos aquí o en este resumen .
fuente
self.view
son redundantes, de uso simpleview
siself
no es necesario.self
Aquí hay una explicación en inglés simple.
Cuando desee convertir el rect de una subvista (
aView
es una subvista de[aView superview]
) al espacio de coordenadas de otra vista (self
).fuente
Cada vista en iOS tiene un sistema de coordenadas. Un sistema de coordenadas es como un gráfico, que tiene eje x (línea horizontal) y eje y (línea vertical). El punto en el que las líneas interesect se llama origen. Un punto está representado por (x, y). Por ejemplo, (2, 1) significa que el punto queda 2 píxeles hacia la izquierda y 1 píxel hacia abajo.
Puede leer más sobre los sistemas de coordenadas aquí: http://en.wikipedia.org/wiki/Coordinate_system
Pero lo que necesita saber es que, en iOS, cada vista tiene su PROPIO sistema de coordenadas, donde la esquina superior izquierda es el origen. El eje X continúa aumentando hacia la derecha, y el eje Y continúa aumentando hacia abajo.
Para la pregunta de puntos de conversión, tome este ejemplo.
Hay una vista, llamada V1, que tiene 100 píxeles de ancho y 100 píxeles de alto. Ahora dentro de eso, hay otra vista, llamada V2, en (10, 10, 50, 50) lo que significa que (10, 10) es el punto en el sistema de coordenadas de V1 donde debe ubicarse la esquina superior izquierda de V2, y ( 50, 50) es el ancho y la altura de V2. Ahora, tome un punto DENTRO del sistema de coordenadas de V2, digamos (20, 20). Ahora, ¿cuál sería ese punto dentro del sistema de coordenadas de V1? Para eso están los métodos (por supuesto, puedes calcularte a ti mismo, pero te ahorran trabajo extra). Para el registro, el punto en V1 sería (30, 30).
Espero que esto ayude.
fuente
Gracias a todos por publicar la pregunta y sus respuestas: me ayudó a resolver esto.
Mi controlador de vista tiene su vista normal.
Dentro de esa vista hay varias vistas de agrupación que hacen poco más que dar a sus vistas secundarias una interacción limpia con restricciones de diseño automático.
Dentro de una de esas vistas de agrupación tengo un botón Agregar que presenta un controlador de vista emergente donde el usuario ingresa cierta información.
Durante la rotación del dispositivo, se alerta al controlador de vista mediante la llamada UIPopoverViewControllerDelegate popoverController: willRepositionPopoverToRect: inView:
La parte esencial que proviene de la explicación dada por las dos primeras respuestas anteriores fue que el rect desde el que necesitaba convertir era los límites del botón Agregar, no su marco.
No he intentado esto con una jerarquía de vista más compleja, pero sospecho que al usar la vista proporcionada en la llamada al método (inView :) obtenemos las complicaciones de los tipos de fealdad de vista de hoja de varios niveles.
fuente
Usé esta publicación para aplicar en mi caso. Espero que esto ayude a otro lector en el futuro.
Una vista solo puede ver sus vistas secundarias e primarias inmediatas. No puede ver las opiniones de sus abuelos o nietos.
Por lo tanto, en mi caso, tengo una gran vista padre llamado
self.view
, en esteself.view
he añadido subvistas llamadosself.child1OfView
,self.child2OfView
. Enself.child1OfView
, he añadido subvistas llamadosself.child1OfView1
,self.child2OfView1
.Ahora, si me muevo físicamente
self.child1OfView1
a un área fuera del límite de otroself.child1OfView
lugarself.view
, entonces para calcular la nueva posición paraself.child1OfView1
elself.view:
fuente
Puede ver el código a continuación para que pueda entender cómo funciona realmente.
fuente
Leí la respuesta y entiendo la mecánica, pero creo que el ejemplo final no es correcto. Según el documento API, la propiedad central de una vista contiene el punto central conocido de la vista en el sistema de coordenadas de la supervista.
Si este es el caso, creo que no tendría sentido intentar pedirle a la supervista que convierta el centro de una subvista DESDE el sistema de coordenadas de la subvista porque el valor no está en el sistema de coordenadas de la subvista. Lo que tendría sentido es hacer lo contrario, es decir, convertir del sistema de coordenadas de la supervista a la de una subvista ...
Puede hacerlo de dos maneras (ambas deben producir el mismo valor):
o
¿Estoy lejos de entender cómo debería funcionar esto?
fuente
Un punto más importante sobre el uso de estas API. Asegúrese de que la cadena de vista principal esté completa entre el rect que está convirtiendo y la vista hacia / desde. Por ejemplo - aView, bView y cView -
Si intentamos ejecutar el método antes de que se haya agregado bView como una subvista de cView, obtendremos una respuesta de litera. Lamentablemente, no hay protección integrada en los métodos para este caso. Esto puede parecer obvio, pero es algo a tener en cuenta en los casos en que la conversión pasa por una larga cadena de padres.
fuente