2010-04-13 6 views
5

Je suis aux prises avec mon UIScrollview pour le faire zoomer sur l'UIImageView sous-jacent. Dans mon contrôleur de vue, je misUIScrollView setZoomScale ne fonctionne pas?

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
return myImageView; 
} 

Dans la méthode viewDidLoad je tente de régler le zoomScale 2 comme suit (notez le UIImageView et l'image est définie dans Interface Builder):

- (void)viewDidLoad { 
[super viewDidLoad]; 

myScrollView.contentSize = CGSizeMake(myImageView.frame.size.width, myImageView.frame.size.height); 
myScrollView.contentOffset = CGPointMake(941.0, 990.0); 
myScrollView.minimumZoomScale = 0.1; 
myScrollView.maximumZoomScale = 10.0; 
myScrollView.zoomScale = 0.7; 
myScrollView.clipsToBounds = YES; 
myScrollView.delegate = self; 

NSLog(@"zoomScale: %.1f, minZoolScale: %.3f", myScrollView.zoomScale, myScrollView.minimumZoomScale); 
} 

J'ai essayé quelques variations de ceci, mais le NSLog montre toujours un zoomScale de 1.0.

Des idées où je visser celui-ci?

Répondre

19

J'ai finalement réussi à faire fonctionner cela. ce qui a causé le problème était l'appel du délégué à la fin. Je l'ai maintenant déplacé et .... nous y voilà.

Nouveau code ressemble à ceci:

- (void)viewDidLoad { 
[super viewDidLoad]; 

myScrollView.delegate = self; 
myScrollView.contentSize = CGSizeMake(myImageView.frame.size.width, myImageView.frame.size.height); 
myScrollView.contentOffset = CGPointMake(941.0, 990.0); 
myScrollView.minimumZoomScale = 0.1; 
myScrollView.maximumZoomScale = 10.0; 
myScrollView.zoomScale = 0.7; 
myScrollView.clipsToBounds = YES; 
} 
+6

Cela semble provenir de l'appel du système d'exploitation -viewForZoomingInScrollView. Si votre délégué est nul, cet appel n'est pas fait, donc le zoom sur les choses est désactivé. –

+0

Merci beaucoup! C'est vraiment vrai. Mais pourquoi cela arrive-t-il? Cela ne peut pas être l'affaire du délégué. – Yeung

1

Voici un autre exemple que j'ai fait. Celui-ci utilise une image qui est incluse dans le dossier de ressource. Par rapport à celui que vous avez celui-ci ajoute le UIImageView à la vue en tant que sous-vue, puis modifie le zoom à l'ensemble de la vue.

-(void)viewDidLoad{ 

[super viewDidLoad]; 

UIImage *image = [UIImage imageNamed:@"random.jpg"]; 

imageView = [[UIImageView alloc] initWithImage:image]; 

[self.view addSubview:imageView]; 

[(UIScrollView *) self.view setContentSize:[image size]]; 

[(UIScrollView *) self.view setMaximumZoomScale:2.0]; 

[(UIScrollView *) self.view setMinimumZoomScale:0.5]; 

} 
+0

Je ne vois pas pourquoi cela pourrait causer des problèmes, mais dans mon désespoir l'ai essayé de toute façon. Résultat inchangé – iFloh

1

Je sais que c'est assez tard que les réponses vont, mais le problème est que votre code appelle zoomScale avant qu'il fixe le délégué. Vous avez raison, les autres éléments ne nécessitent pas de délégué, mais zoomScale le fait car il doit être capable de rappeler lorsque le zoom est terminé. Au moins c'est comme ça que je pense que ça fonctionne.

+0

Bienvenue sur SO @turboc! Ce commentaire est sans aucun doute utile, mais pour référence future, ajouter un commentaire tel que celui-ci dans la section "commentaires" ci-dessous le poste approprié (dans ce cas, le poste qui a déjà été accepté comme une réponse). – ewitkows

0

Mon code doit être complètement fou parce que l'échelle que j'utilise est complètement opposée à ce que font les tutoriels et les autres. Pour moi, minScale = 1 qui indique que l'image est entièrement réduite et correspond à la UIImageView qui le contient.

Voici mon code:

[self.imageView setImage:image]; 
    // Makes the content size the same size as the imageView size. 
    // Since the image size and the scroll view size should be the same, the scroll view shouldn't scroll, only bounce. 
    self.scrollView.contentSize = self.imageView.frame.size; 

    // despite what tutorials say, the scale actually goes from one (image sized to fit screen) to max (image at actual resolution) 
    CGRect scrollViewFrame = self.scrollView.frame; 
    CGFloat minScale = 1; 
    // max is calculated by finding the max ratio factor of the image size to the scroll view size (which will change based on the device) 
    CGFloat scaleWidth = image.size.width/scrollViewFrame.size.width; 
    CGFloat scaleHeight = image.size.height/scrollViewFrame.size.height; 
    self.scrollView.maximumZoomScale = MAX(scaleWidth, scaleHeight); 
    self.scrollView.minimumZoomScale = minScale; 
    // ensure we are zoomed out fully 
    self.scrollView.zoomScale = minScale; 

Cela fonctionne comme je le pense. Lorsque je charge l'image dans le UIImageView, il est complètement dézoomé. Je peux ensuite zoomer et puis je peux faire un panoramique de l'image.