2010-11-20 12 views
5

Possiedo unin uno UIScrollView e ho qualche problema con la proprietà contentOffset. Dal riferimento Apple, questo è definito come:contentOffset in UIScrollView dopo la rotazione di iPhone

contentOffset: il punto in cui l'origine della visualizzazione del contenuto è sfalsata rispetto all'origine della vista di scorrimento.

Ad esempio, se l'immagine è all'angolo superiore sinistro dello schermo come sotto indicate, la contentOffset sarebbe (0,0):

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

Per la rotazione del dispositivo Ho la seguente impostazione:

scrollView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | 
     UIViewAutoresizingFlexibleHeight); 

imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | 
     UIViewAutoresizingFlexibleHeight); 

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

Ciò farà ruotare tutto attorno al centro dello schermo. Dopo la rotazione dello schermo, quindi schermata avrà un aspetto simile a questo:

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

Il mio problema è che se ora leggo di contentOffset, è ancora (0,0). (Se sposto la UIImage in modalità orizzontale, il valore di contentOffset viene aggiornato, ma viene calcolato rispetto all'origine sbagliata.)

C'è un modo per calcolare le coordinate per UIImage rispetto all'angolo in alto a sinistra angolo dello schermo. contentOffset sembra restituire questo valore solo quando lo schermo si trova nell'orientamento iniziale della vista.

Ho provato a leggere self.view.transform e scrollView.transform, ma sono sempre l'identità.

risposta

3

Ecco un modo per farlo: Per la ScrollView impostato

scrollView.autoresizingMask =(UIViewAutoresizingFlexibleWidth 
            | UIViewAutoresizingFlexibleHeight); 

scrollView.contentMode = UIViewContentModeTopRight; 

La modalità UIViewContentModeTopRight manterrà alto a sinistra alle coordinate (0,0), anche se il comportamento di rotazione non è corretto. Per ottenere lo stesso comportamento di rotazione come in UIViewContentModeCenter aggiungere

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

in willAnimateRotationToInterfaceOrientation. fix è la funzione

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

Il codice sopra farà ScrollView ruotare intorno al centro dello schermo e garantire inoltre che il corder alto a sinistra è sempre sono coordinate (0,0).

Problemi correlati