web-dev-qa-db-fra.com

Pincer pour zoomer sur UIImageView dans scrollView?

J'utilise le scénarimage (iOS 6.0) pour créer une visionneuse de galerie de photos pour mon application. Voici comment mon imageViewController est configuré dans le storyboard:

enter image description here

Je me suis assuré d'activer userInteraction et plusieurs contacts à la fois sur l'imageView et scrollView. Ce que je veux faire, c’est que je veux zoomer sur l’imageView (échelle maximale 3) et pouvoir effectuer un panoramique. C'est ce que j'ai actuellement, cependant, même si le geste de pincement est détecté, l'échelle ne change pas.

- (IBAction)imagePinched:(id)sender {

if (pinchRecognizer.state == UIGestureRecognizerStateEnded || pinchRecognizer.state == UIGestureRecognizerStateChanged) {

    NSLog(@"gesture.scale = %f", pinchRecognizer.scale);

    CGFloat currentScale = self.fullScreenView.frame.size.width / self.fullScreenView.bounds.size.width;
    CGFloat newScale = currentScale * pinchRecognizer.scale;

    if (newScale < 1) {
        newScale = 1;
    }
    if (newScale > 3) {
        newScale = 3;
    }

    CGAffineTransform transform = CGAffineTransformMakeScale(newScale, newScale);
        self.fullScreenView.transform = transform;
        pinchRecognizer.scale = 1;
    }

}

La plupart des questions et des didacticiels en ligne traitent de la création et de la création de vues par programme, mais moins il y a de code, mieux c'est (à mes yeux). Quelle est la meilleure façon de faire fonctionner cela avec le scénarimage? Merci d'avance!!!


MIS À JOUR:

Voici mon code de fichier .m complet:

- (void)viewDidLoad
{
    [super viewDidLoad];

    //Assign an image to this controller's imageView
    fullScreenView.image = [UIImage imageNamed:imageString];

    //Allows single and double tap to work
    [singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer];
}

- (IBAction)imageTapped:(id)sender {

    NSLog(@"Image Tapped.");

    //On tap, fade out viewController like the Twitter.app
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (IBAction)imageDoubleTapped:(id)sender {

    NSLog(@"Image Double Tapped.");

    //On double tap zoom into imageView to fill in the screen.
    [fullScreenView setContentMode:UIViewContentModeScaleAspectFill];
}

- (IBAction)imagePinched:(id)sender {

    if (pinchRecognizer.state == UIGestureRecognizerStateEnded || pinchRecognizer.state == UIGestureRecognizerStateChanged) {

        NSLog(@"gesture.scale = %f", pinchRecognizer.scale);

        CGFloat currentScale = self.fullScreenView.frame.size.width / self.fullScreenView.bounds.size.width;
        CGFloat newScale = currentScale * pinchRecognizer.scale;

        if (newScale < 1) {
            newScale = 1;
        }
        if (newScale > 3) {
            newScale = 3;
        }

        CGAffineTransform transform = CGAffineTransformMakeScale(newScale, newScale);
        self.fullScreenView.transform = transform;
        pinchRecognizer.scale = 1;
    }
}

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


-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {

}

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

@end
15
KingPolygon

Je pense meilleure solution dans la documentation Apple

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView

{

    return self.imageView;

}
- (void)viewDidLoad {

    [super viewDidLoad];

    self.scrollView.minimumZoomScale=0.5;

    self.scrollView.maximumZoomScale=6.0;

    self.scrollView.contentSize=CGSizeMake(1280, 960);

    self.scrollView.delegate=self;

}

Consultez la documentation Apple

33
Vineesh TP

La première étape consiste à vérifier que les délégués appropriés sont implémentés dans vos vues. Par exemple dans le fichier .m

@interface myRootViewController () <.., UIGestureRecognizerDelegate, UIScrollViewDelegate, ...>

Dans la documentation, assurez-vous que ceci est implémenté:

La classe UIScrollView peut avoir un délégué qui doit adopter le protocole UIScrollViewDelegate. Pour que le zoom et le panoramique fonctionnent, le délégué doit implémenter viewForZoomingInScrollView: et scrollViewDidEndZooming: withView: atScale:; De plus, l'échelle de zoom maximale (maximumZoomScale) et minimale (minimumZoomScale) doit être différente. 

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


-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{}

La méthode scrollViewDidEndZooming peut rester vide pour l'instant. Si vous l'avez déjà fait ou si cela ne fonctionne toujours pas, veuillez poster davantage de votre code et il sera alors plus facile d'aider de manière plus spécifique.

2
ceekay

Vous devez faire ce que Wadi a suggéré ci-dessus, mais également définir setMinimumZoomScale pour qu'il soit différent de setMaximumZoomScale. Ils sont tous deux 1.0f par défaut. 

Après cela, la UIImageView devrait être pince

1
Nate

J'ai créé une classe pour gérer le zoom sur UIImageViews similaire à Instagram. Peut-être ce que vous cherchez, sinon vous pouvez regarder comment je l'ai réalisé. https://github.com/twomedia/TMImageZoom

0
Thomas Maw

Ici est la façon dont Apple recommande de faire ce que vous voulez faire. J'ai utilisé le code fourni par Apple et cela a fonctionné comme un charme! Si vous souhaitez optimiser la gestion de la mémoire, vous pouvez utiliser iCarousel (made by nicklockwood), qui dispose d’une gestion de cache pour les vues inutilisées dealloc!

0
lucaslt89

J'ai créé une application de démonstration entièrement opérationnelle (de nature similaire à la galerie de photos par défaut de Facebook) qui montre comment pincer pour zoomer sur la vue d'image imbriquée dans une vue de défilement avec la mise en forme automatique et les storyboards. Voir mon projet ici: http://rexstjohn.com/facebook-like-ios-photo-modal-gallery-swipe-gestures/ .

Il inclut également le chargement de photos asynchrone via MKNetworkKit et le glissement de gestes dans une galerie de photos. Profitez-en et j'espère que cela fera gagner du temps à tout le monde en essayant de comprendre cela parce que c'est un peu gênant.

0
Delete