2010-11-20 13 views
5

Mam UIImageView w i mam pewne problemy z właściwością contentOffset. Odwołanie Apple jest zdefiniowane jako:contentOffset w UIScrollView po obróceniu iPhone'a

contentOffset: Punkt, w którym początek widoku treści jest przesunięty względem początku widoku przewijania.

Na przykład, jeżeli obraz jest w górnym lewym rogu ekranu, jak poniżej THEN contentOffset będzie (0,0)

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

Przez obrócenie urządzenia I mają następujące ustawienia:

scrollView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | 
     UIViewAutoresizingFlexibleHeight); 

imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | 
     UIViewAutoresizingFlexibleHeight); 

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

Spowoduje to, że wszystko obróci się wokół środka ekranu. Po obróceniu ekranu, to ekran będzie wtedy wyglądać tak:

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

Moim problemem jest to, że gdybym teraz czytać z contentOffset, nadal jest (0,0). (Jeśli przestawię UIImage w trybie poziomym, wartość contentOffset zostanie zaktualizowana, ale zostanie obliczona w odniesieniu do niewłaściwego pochodzenia).

Czy istnieje sposób obliczenia współrzędnych dla UIImage w odniesieniu do lewego górnego rogu róg ekranu. Wydaje się, że tylko contentOffset zwraca tę wartość, gdy ekran znajduje się w początkowej orientacji widoku.

Próbowałem przeczytać self.view.transform i scrollView.transform, ale one zawsze są tożsamością.

Odpowiedz

3

Oto jeden ze sposobów, aby to zrobić: Na Scrollview ustawić

scrollView.autoresizingMask =(UIViewAutoresizingFlexibleWidth 
            | UIViewAutoresizingFlexibleHeight); 

scrollView.contentMode = UIViewContentModeTopRight; 

Tryb UIViewContentModeTopRight zachowa lewy górny róg na współrzędnych (0,0), nawet jeśli zachowanie rotacja nie jest poprawna. Aby uzyskać takie samo zachowanie rotacji jak w UIViewContentModeCenter dodać

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

do willAnimateRotationToInterfaceOrientation. fix jest funkcją

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; 
} 

Powyższy kod dokonać Scrollview obracać się wokół środka ekranu, jak również zapewnić, że w lewym górnym Corder zawsze są współrzędne (0,0).

Powiązane problemy