2011-05-17 27 views
8

estoy tratando de obtener las coordenadas de la ventana de una vista de tabla utilizando el siguiente código:iPhone ventana correcta paisaje coordina

[self.tableView.superview convertRect:self.tableView.frame toView:nil]

Se informa las coordenadas correctas, mientras que en el modo vertical, pero cuando puedo girar con el paisaje ya no informa las coordenadas correctas. Primero, voltea las coordenadas x, y, y el ancho y alto. Sin embargo, ese no es realmente el problema. El problema real es que las coordenadas son incorrectas. En vertical, las coordenadas de la ventana para el marco de la vista de tabla son {{0, 114}, {320, 322}}, mientras que en el paisaje, las coordenadas de la ventana son {{32, 0}, {204, 480}}. Obviamente, el valor de x aquí es incorrecto, ¿verdad? ¿No debería ser 84? Estoy buscando una solución a este problema, y ​​si alguien sabe cómo conseguir la correcta ventana coordenadas de un punto de vista en modo horizontal, Les agradecería mucho que tuviera a compartir ese conocimiento conmigo.

Estas son algunas capturas de pantalla para que pueda ver el diseño de vista.

Retrato: http://i.stack.imgur.com/IaKJc.png

paisaje: http://i.stack.imgur.com/JHUV6.png

+0

Estoy viendo el mismo problema. A veces calcula correctamente las coordenadas, a veces no lo hace. –

Respuesta

0

Usted debe ser capaz de obtener la vista de tabla de coordenadas actuales self.tableView.bounds

0

El código debería ser:

[tableView convertRect:tableView.bounds toView:[UIApplication sharedApplication].keyWindow]; 

Eso le dará el rectángulo de la vista en el sistema de coordenadas de la ventana. Asegúrese de usar "límites" y no "marco". frame es el rectángulo de la vista en su sistema de coordenadas de vista principal ya. "límites" es el rectángulo de vista en su propio sistema. Entonces, el código anterior le pide a la vista de tabla que convierta su propio rectángulo de su propio sistema al de la ventana. Su código anterior le pedía a la vista principal de la tabla que convierta el rectángulo de la tabla del sistema de coordenadas principal a nada.

+0

En realidad, la documentación para convertRect: toView: dice: "Si la vista es nula, este método en su lugar se convierte en coordenadas de la base de la ventana". Probé tu código y da el mismo resultado que el mío. Gracias por la sugerencia. – EJV

+0

Ah. Estás en lo correcto. – Dancreek

6

que he encontrado lo que creo que es el comienzo de la solución. Parece que las coordenadas que usted y yo estamos viendo se basan en la esquina inferior izquierda o superior derecha, según si la orientación es UIInterfaceOrientationLandscapeRight o UIInterfaceOrientationLandscapeLeft.

No sé por qué, pero espero que ayude. :)

[ACTUALIZACIÓN] Así que supongo que el origen de la ventana es 0,0 en modo retrato normal, y gira con el ipad/iphone.

Así que aquí es cómo lo resolvió.

En primer lugar me agarra mi orientación, límites de la ventana y de la rect de mi punto de vista dentro de la ventana (con las coordenadas torcidas)

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
CGRect windowRect = appDelegate.window.bounds; 
CGRect viewRectAbsolute = [self.guestEntryTableView convertRect:self.guestEntryTableView.bounds toView:nil]; 

Entonces, si la orientación es horizontal, invierto las coordenadas X e Y y el anchura y altura

if (UIInterfaceOrientationLandscapeLeft == orientation ||UIInterfaceOrientationLandscapeRight == orientation) { 
    windowRect = XYWidthHeightRectSwap(windowRect); 
    viewRectAbsolute = XYWidthHeightRectSwap(viewRectAbsolute); 
} 

Entonces llamo a mi función para fijar el origen de basarse en la parte superior izquierda, sin importar el giro de la ipad/iphone. Se fija el origen dependiendo de donde vive actualmente 0,0 (dependiendo de la orientación)

viewRectAbsolute = FixOriginRotation(viewRectAbsolute, orientation, windowRect.size.width, windowRect.size.height); 

Estas son las dos funciones que utilizo

CGRect XYWidthHeightRectSwap(CGRect rect) { 
    CGRect newRect; 
    newRect.origin.x = rect.origin.y; 
    newRect.origin.y = rect.origin.x; 
    newRect.size.width = rect.size.height; 
    newRect.size.height = rect.size.width; 
    return newRect; 
} 

CGRect FixOriginRotation(CGRect rect, UIInterfaceOrientation orientation, int parentWidth, int parentHeight) { 
    CGRect newRect; 
    switch(orientation) 
    { 
     case UIInterfaceOrientationLandscapeLeft: 
      newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), rect.origin.y, rect.size.width, rect.size.height); 
      break; 
     case UIInterfaceOrientationLandscapeRight: 
      newRect = CGRectMake(rect.origin.x, parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height); 
      break; 
     case UIInterfaceOrientationPortrait: 
      newRect = rect; 
      break; 
     case UIInterfaceOrientationPortraitUpsideDown: 
      newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height); 
      break; 
    } 
    return newRect; 
} 
0

Trate límites en lugar de marco self.parentViewController.view.bounds por ella me da coords ajustados según la orientación actual

3

Esto es un truco, pero funciona para mí:

UIView *toView = [UIApplication sharedApplication].keyWindow.rootViewController.view; 
[self.tableView convertRect:self.tableView.bounds toView:toView]; 

No estoy seguro de que esta sea la mejor solución. Es posible que no funcione de manera confiable si su controlador de vista raíz no admite las mismas orientaciones que el controlador de vista actual.

+0

Te daría tantos votos ascendentes si pudiera. – MusiGenesis

+0

Sí, es un truco, pero funciona a la perfección. – siuying

Cuestiones relacionadas