2010-11-20 11 views
5

Tengo un UIImageView en un UIScrollView y tengo algunos problemas con la propiedad contentOffset. A partir de la referencia de Apple, esto se define como:contentOffset en UIScrollView después de la rotación del iPhone

contentOffset: El punto en el que el origen de la vista de contenido se compensa desde el origen de la vista de desplazamiento.

Por ejemplo, si la imagen está en la esquina superior izquierda de la pantalla como a continuación, entonces el contentOffset haría (0,0):

_________ 
    |IMG | 
    |IMG | 
    |  | 
    |  | 
    |  | 
    |  | 
    --------- 

Para la rotación dispositivo tengo la siguiente configuración:

scrollView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | 
     UIViewAutoresizingFlexibleHeight); 

imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | 
     UIViewAutoresizingFlexibleHeight); 

imageView.contentMode = UIViewContentModeCenter; 
    scrollView.contentMode = UIViewContentModeCenter; 

Esto hará que todo gire alrededor del centro de la pantalla. Después de girar la pantalla, a continuación, a continuación, la pantalla se verá así:

______________ 
    |  IMG | 
    |  IMG | 
    |   | 
    -------------- 

Mi problema es que si ahora leo de contentOffset, todavía es (0,0). (Si muevo el UIImage en modo horizontal, se actualiza el valor de contentOffset, pero se calcula con respecto al origen incorrecto.)

¿Hay alguna manera de calcular las coordenadas del UIImage con respecto a la esquina superior izquierda esquina de la pantalla. contentOffset solo parece devolver este valor cuando la pantalla está en la orientación inicial de la vista.

He intentado leer self.view.transform y scrollView.transform, pero siempre son la identidad.

Respuesta

3

Aquí es una manera de hacer esto: Para el ScrollView establece

scrollView.autoresizingMask =(UIViewAutoresizingFlexibleWidth 
            | UIViewAutoresizingFlexibleHeight); 

scrollView.contentMode = UIViewContentModeTopRight; 

El modo UIViewContentModeTopRight mantendrá la esquina superior izquierda en la coordenada (0,0) incluso si el comportamiento de rotación no es correcta. Para obtener el mismo comportamiento de rotación como en UIViewContentModeCenter añadir

scrollView.contentOffset = fix(sv.contentOffset, currentOrientation, goalOrientation); 

en willAnimateRotationToInterfaceOrientation. fix es la función

CGPoint fix(CGPoint offset, UIInterfaceOrientation currentOrientation, UIInterfaceOrientation goalOrientation) { 

CGFloat xx = offset.x; 
CGFloat yy = offset.y; 

CGPoint result; 

if (UIInterfaceOrientationIsLandscape(currentOrientation)) { 

    if (UIInterfaceOrientationIsLandscape(goalOrientation)) { 
     // landscape -> landscape 
     result = CGPointMake(xx, yy); 
    } else { 
     // landscape -> portrait 
     result = CGPointMake(xx+80, yy-80); 
    } 
} else { 
    if (UIInterfaceOrientationIsLandscape(goalOrientation)) { 
     // portrait -> landscape 
     result = CGPointMake(xx-80, yy+80); 
    } else { 
     // portrait -> portrait 
     result = CGPointMake(xx, yy); 
    } 
} 
return result; 
} 

El código anterior hará que el ScrollView gire alrededor del centro de la pantalla y también asegurarse de que el grabador superior izquierda es siempre son las coordenadas (0,0).

Cuestiones relacionadas