2010-12-06 16 views
0

J'ai ce problème avec ScrollView zoom. Il y a beaucoup d'articles à ce sujet mais je n'arrive pas à trouver une explication, un tutoriel ou un extrait de code.iPhone: comment zoomer seulement l'image de scrollview

Je dispose d'une vue défilante en plein écran et d'une vue d'image en plein écran. Vue intérieure de l'image Je charge les images AspectFit (elles peuvent être verticales ou horizontales, celles horizontales ont un espace noir au-dessus et en dessous). Lorsque je fais un zoom, je fais un zoom non seulement sur l'image mais aussi sur la zone environnante (le reste de l'image). De plus, lorsque je fais tourner le simulateur en zoom, l'image va dans le coin supérieur droit au lieu d'être centrée comme au début. Peu de pixels sortent même de l'écran.

Je voudrais vraiment zoomer seulement image au lieu de l'image entière ou au moins avoir l'image centrée tout le temps quand zoomé.

Toute aide bienvenue ..

Répondre

1

J'ai résolu le problème, ce n'est pas le meilleur code mais ça marche bien pour moi maintenant, je vais probablement le nettoyer un peu plus tard. Publier ici, peut-être que cela va aider quelqu'un :)

UIImage *img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] 
            pathForResource:someImage ofType:@"jpg"]]; 
CGFloat scale; 
    if (scrollView.frame.size.width < scrollView.frame.size.height) // portrait 
     scale = scrollView.frame.size.width/img.size.width; 
    if (scrollView.frame.size.width > scrollView.frame.size.height) // landscape 
     scale = scrollView.frame.size.height/img.size.height; 

imgView.frame = CGRectMake(scrollView.frame.origin.x, scrollView.frame.origin.y, 
          img.size.width*scale, img.size.height*scale); 
imgView.center = CGPointMake(scrollView.frame.size.width/2, scrollView.frame.size.height/2); 

[imgView setImage:img]; 

[scrollView setZoomScale:scale]; 
0

De l'exemple PhotoScroller; ajouter à layoutSubviews:

// center the image as it becomes smaller than the size of the screen 

CGSize boundsSize = self.bounds.size; 
CGRect frameToCenter = imageView.frame; 

// center horizontally 
if (frameToCenter.size.width < boundsSize.width) 
    frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width)/2; 
else 
    frameToCenter.origin.x = 0; 

// center vertically 
if (frameToCenter.size.height < boundsSize.height) 
    frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height)/2; 
else 
    frameToCenter.origin.y = 0; 

imageView.frame = frameToCenter; 

Cela ne va pas aider avec zoom seulement l'image, mais il va le garder centré lorsque vous effectuez un zoom au moins.

+0

où devrais-je le mettre? :) Je viens de changer les images avec imgView.image = [UIImage imageNamed: whichNext]; Je n'initialise pas vraiment de Rect avec image. Je change juste le contenu de imageView. – yosh

+0

Vous mettriez cela dans layoutSubviews - c'est bien si vous n'initialisez pas le cadre de UIImageView quand vous le créez, il prend la taille de l'image avec laquelle vous l'initialisez (mais si vous lui donnez une image différente avec une nouvelle taille vous devriez appeler '[sizeToFit]' pour le redimensionner). Comme vous pouvez le voir ci-dessus, vous ne changez pas sa taille dans ce cas non plus; vous changez simplement son origine pour qu'il se centre automatiquement lorsque vous effectuez un zoom arrière. – Ertebolle