2010-07-10 19 views
26

Deseo 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 ventana debe ser 51 + 44 (altura de la barra de navegación) +20 (altura de la barra de estado) = 115. Significa en el sistema de coordenadas de la ventana que scrollView.frame.origin debe ser (0,115). Intenté con convertPoint: métodos pero obteniendo (0,51) o (0,0) algunas veces. Por favor proporciona una solución a esto. GraciasConvierta un punto de origen UIView en su sistema de coordenadas de ventana

+0

versión Swift abajo –

Respuesta

9

He intentado con la solución TechZen pero fue en vano. En lugar de convertir el origen de scrollView, me referí a apple docs UIWindow class Reference y convertí el endCenter del teclado al sistema de coordenadas de mi vista utilizando este código [self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow]. Este pedazo de código funcionó y por lo tanto resolvió mi problema. Sin embargo, todavía queda la pregunta de por qué no da la coordenada correcta de scrollView.origin.So, básicamente tengo una solución al convertir el teclado endcenter en lugar de scrollView.origin. Ah, y estaba haciendo todo esto para calcular la nueva altura de scrollView cuando aparece el teclado en la pantalla. Entonces, si alguien tiene una solución a este problema o una solución mejor, por favor avísanos.

+1

tiene alguna solución>? Tengo el mismo problema – Jasmeet

+0

Mejor solución: https://github.com/michaeltyson/TPKeyboardAvoiding – Hemang

47

Parece que no está convirtiendo entre las vistas adecuadas. marco de un punto de vista se establece en las coordenadas de su supervista, no sus propias coordenadas internas, por lo que si estuviera tratando de convertir el origen de un objeto de coordenadas de la ventana, lo que tendría que utilizar el supervista:

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

Sin embargo , es incluso más simple 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]; 
+0

I intenté esta pieza de código de código en el método viewDidLoad, con uno mismo reemplazado por self.view y theWindow reemplazado por self.view.window, pero está dando (0,0) como la salida – Nishit

+0

Verificaría que la propiedad de la ventana de la vista no es nada A menudo lo es – TechZen

+1

Gracias por responder. Cómo lidiar con este problema Intenté reemplazar self.view.window con [UIApplication sharedApplication] .keywindow pero fue en vano. – Nishit

5

Tenga en cuenta que estas funciones solo funcionarán después de que el controlador de vista termine de preparar las subvistas. Así que si quieres que cuando las cargas de vista, se puede utilizar 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]; 
} 
2

Swift 2.1:

En viewDidAppear (de lo contrario los elementos todavía 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)") 
+4

En Swift 3: var yourFrame = yourScrollView.convertRect (yourScrollView.frame, to: self.view) – Medhi

Cuestiones relacionadas