2013-08-09 2 views
4

J'ai un problème avec UIImageView dans un UIScrollView. Dans Interface Builder, UIScrollView occupe l'intégralité de l'écran et UIImageView occupe l'intégralité de UIScrollView. Le problème est que lorsque j'ai une image orientée paysage, je la règle sur l'aspect, donc j'ai des barres grises en haut et en bas (ce que je veux). Cependant, lorsque je bosse sur la photo, une fois que la photo fait un zoom assez grand pour s'adapter à l'écran vertical, je veux qu'il ne se déplace pas dans la zone grise qui était au-dessus. Voir les captures d'écran que j'ai jointes. Je veux essentiellement que cela fonctionne comme l'application Photos à cet égard. Voici mon code pour la mise en place du UIScrollView et UIImageView:UIImageView à l'intérieur UIScrollView Pans Too Far

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
    self.imageView.image = [UIImage imageNamed:@"IMG_0300.JPG"]; 
    self.imageView.contentMode = UIViewContentModeScaleAspectFit; 
    self.scrollView.clipsToBounds = YES; 
    self.scrollView.contentSize = self.imageView.bounds.size; 
    self.scrollView.zoomScale = 1.0; 
    self.scrollView.maximumZoomScale = 5.0; 
    self.scrollView.minimumZoomScale = 1.0; 

} 

-(void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return self.imageView; 
} 

See how it pans too far up

Merci à l'avance.

Jacob

Répondre

10

Il est tout votre UIImageView zoomée, non seulement son image, mais aussi les barres grises. Votre scrollView reflète simplement cela. Le résultat que vous voulez sans doute peut être fait comme ceci:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    UIImage *image = [UIImage imageNamed:@"IMG_0300.JPG"]; 
    CGFloat ratio = CGRectGetWidth(self.scrollView.bounds)/image.size.width; 
    self.imageView.bounds = CGRectMake(0, 0, CGRectGetWidth(self.scrollView.bounds), image.size.height * ratio); 
    self.imageView.center = CGPointMake(CGRectGetMidX(self.scrollView.bounds), CGRectGetMidY(self.scrollView.bounds)); 
    self.imageView.image = image; 
    self.scrollView.clipsToBounds = YES; 
    self.scrollView.contentSize = self.imageView.bounds.size; 
    self.scrollView.zoomScale = 1.0; 
    self.scrollView.maximumZoomScale = 10.0; 
    self.scrollView.minimumZoomScale = 1.0; 

} 

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 
{ 
    UIView *subView = self.imageView; 
    CGFloat offsetX = (scrollView.bounds.size.width > scrollView.contentSize.width)? 
    (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5 : 0.0; 

    CGFloat offsetY = (scrollView.bounds.size.height > scrollView.contentSize.height)? 
    (scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5 : 0.0; 

    subView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX, 
           scrollView.contentSize.height * 0.5 + offsetY); 
} 

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return self.imageView; 
} 
+0

Merci, cette réponse est si bon que je l'accepte deux fois si je pouvais :) –

+0

Grand. Merci . M'a beaucoup aidé – sajwan

+0

J'ai implémenté votre code et dans viewDidAppear: animé les limites UIImageView sont de retour à la taille déclarée dans le storyboard. Avez-vous une idée de ce qui peut déclencher cela? –

0

Plutôt que de « ont des barres grises en haut et en bas », définissez la couleur de fond du UIScrollView gris.

De même, n'utilisez pas les cotes de vue dans viewDidLoad car les sous-vues ne sont pas encore présentées. Déplacez-le auou au viewWillAppear. En outre, définissez le UIScrollViewcontentSize en fonction de votre zoom maximum. Par exemple:

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 

    self.scrollView.backgroundColor = [UIColor lightGrayColor]; // or other color 
    CGFloat maxScale = 5.0; 
    self.scrollView.zoomScale = 1.0; 
    self.scrollView.maximumZoomScale = maxScale; 
    self.scrollView.minimumZoomScale = 1.0; 
    CGSize contentSize = CGSizeMake(self.scrollView.bounds.size.width * maxScale, self.scrollView.bounds.size.height * maxScale); 
    self.scrollView.contentSize = contentSize; 

    // ... 
} 
0

Essayez ceci:

UIView *subView = self.imageView; 
    CGFloat offsetX = (scrollView.bounds.size.width > scrollView.contentSize.width)? 
    (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5 : 0.0; 

    CGFloat offsetY = (scrollView.bounds.size.height > scrollView.contentSize.height)? 
    (scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5 : 0.0; 

    subView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX, 
           scrollView.contentSize.height * 0.5 + offsetY); 
Questions connexes