ios uiview coordinate-systems uiwindow

ios - Convertir un punto de origen UIView a su sistema de coordenadas de ventana



coordinate-systems uiwindow (4)

He intentado con la solución TechZen pero en vano. En lugar de convertir el origen de scrollView, me referí a la clase de referencia UIWindow de Apple docs y convertí el centro de atención del teclado al sistema de coordenadas de mi vista usando este código [self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow] . Esta pieza de código funcionó y por lo tanto resolvió mi problema. Sin embargo, la pregunta sigue siendo por qué no proporciona la coordenada adecuada de scrollView.origin.Así que, básicamente, obtuve una solución al convertir el endcenter del teclado en lugar de scrollView.origin . Ah, y estaba haciendo todo esto para calcular la nueva altura de mi scrollView cuando aparece el teclado en la pantalla. Por lo tanto, si alguien tiene una solución para este problema o una solución mejor, háganoslo saber a todos.

Quiero obtener el origen de scrollView en el sistema de coordenadas de la ventana. Por ejemplo, actualmente, el origen de scollView es (0,51). Pero en el sistema de coordenadas de la ventana debe ser 51 + 44 (altura de la barra de navegación) +20 (altura de la barra de estado) = 115. Significa que en el sistema de coordenadas de la ventana debe ser scrollView.frame.origin (0,115). Intenté con convertPoint: métodos pero obteniendo (0,51) o (0,0) a veces. Por favor proporcione una solución a esto. Gracias


Suena como que no se está convirtiendo entre las vistas adecuadas. El marco de una vista se ajusta a las coordenadas de su supervisión, no a sus propias coordenadas internas, por lo que si intentara convertir el origen de una vista en coordenadas de ventana, deberá usar la supervisión:

[[self superview] convertPoint:self.frame.origin toView:theWindow];

Sin embargo, es incluso más sencillo convertir el punto cero de la vista a la ventana. Las dos piezas de código son equivalentes, por lo que no es necesario utilizar el origen en absoluto.

[self convertPoint:CGPointZero toView:theWindow];


Tenga en cuenta que estas funciones solo funcionarán después de que el controlador de vista haya terminado de diseñar subvistas. Por lo tanto, si desea que cuando se carguen vistas, puede usar viewDidLayoutSubviews / viewDidAppear, pero no en viewDidLoad / viewWillAppear etc ...

Este código funcionó para mí:

- (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; CGPoint originInSuperview = [self.view.superview convertPoint:CGPointZero fromView:self.scrollView]; }


Swift 2.1:

En viewDidAppear (de lo contrario, los elementos aún no están en capas) de su ViewController:

var yourFrame = yourScrollView.convertRect(yourScrollView.frame, toView: self.view) //PRINT THE WHOLE RECT print(yourFrame) //PRINT A DETAILED VERSION OF THE FRAME, ALSO CAN PERFORM CALCULATION BETWEEN THE RECT PARAMETERS TO GET , FOR EXAMPLE, WIDTH POINT IN THE SUPERVIEW: print("X: /(yourFrame.origin.x) Y: /(yourFrame.origin.y) WIDTH: /(yourFrame.width) HEIGHT: /(yourFrame.height)")