2010-11-20 4 views
5

J'ai un UIImageView dans un UIScrollView et j'ai quelques problèmes avec la propriété contentOffset. De la référence d'Apple, il est défini comme suit:contentOffset dans UIScrollView après la rotation de l'iPhone

contentOffset: point auquel l'origine de la vue de contenu est décalée par rapport à l'origine de la vue de défilement.

Par exemple, si l'image est dans le coin supérieur gauche de l'écran comme ci-dessous alors la contentOffset serait (0,0):

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

Pour la rotation de l'appareil je le paramètre suivant:

scrollView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | 
     UIViewAutoresizingFlexibleHeight); 

imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | 
     UIViewAutoresizingFlexibleHeight); 

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

Cela fera tout tourner autour du centre de l'écran. Après avoir fait tourner l'écran, puis l'écran ressemblera alors à ceci:

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

Mon problème est que si je lis maintenant de contentOffset, il est encore (0,0). (Si je déplace le UIImage en mode paysage, la valeur de contentOffset est mise à jour, mais elle est calculée par rapport à la mauvaise origine.)

Existe-t-il un moyen de calculer les coordonnées de l'UIImage par rapport à la partie supérieure gauche? coin de l'écran. contentOffset semble seulement renvoyer cette valeur lorsque l'écran est dans l'orientation initiale de la vue. Je ai essayé de lire self.view.transform et scrollView.transform, mais ils sont toujours l'identité.

Répondre

3

Voici une façon de le faire: Pour le scrollview mis

scrollView.autoresizingMask =(UIViewAutoresizingFlexibleWidth 
            | UIViewAutoresizingFlexibleHeight); 

scrollView.contentMode = UIViewContentModeTopRight; 

Le mode UIViewContentModeTopRight gardera même si le comportement de rotation du coin supérieur gauche à la coordonnée (0,0) est incorrect. Pour obtenir le même comportement de rotation comme dans UIViewContentModeCenter ajouter

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

en willAnimateRotationToInterfaceOrientation. fix est la fonction

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

Le code ci-dessus fera l'scrollview tourner autour du centre de l'écran et également veiller à ce que la corder en haut à gauche est toujours sont coordonnées (0,0).

Questions connexes