2013-07-19 5 views
8

Mi piacerebbe creare un'app per iOS di tipo Facebook, che consente di creare un'immagine dalla timeline a schermo intero quando l'utente tocca su di essa.Come faccio a ingrandire un'immagine a schermo intero quando viene toccata?

Aggiornamento:

sto usando UICollectionView per visualizzare l'immagine nella cella, così sembra dovrei utilizzare collectionView:didSelectItemAtIndexPath: metodo? e imageView si trova nella cella, quindi posso ancora espandere direttamente a schermo intero?

attaccato un paio di immagini che seguono:

enter image description here

enter image description here

risposta

5

uso UITapGestureRecognizer, e non dimenticate di impostare imageView.userInteractionEnabled = YES; perché l'immagine di default da non avere UserInteraction.

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
[singleTap setNumberOfTapsRequired:1]; 

[imageView addGestureRecognizer:singleTap]; 


-(void)handleSingleTap:(id)sender { 
// push you view here 
//code for full screen image 
} 
+0

scuse per la descrizione offuscata. Sto usando UICollectionView per visualizzare l'immagine nella cella, quindi sembra che dovrei usare collectionView: didSelectItemAtIndexPath: method? e imageView si trova nella cella, quindi posso ancora espandere direttamente a schermo intero? –

+0

@Saaph J. Lin: sì una volta controlla la risposta di TomSwift. – Balu

0

quello che ho capito è che avete la vostra immagine in UIWebView Questo è quello che ho in questo momento, impostare il Delegato UIWebViews di auto quindi aggiungere questo:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { 
    if (navigationType == UIWebViewNavigationTypeLinkClicked) { 
     NSURL *URL = [request URL];   
     ImageViewer *imageView = [[[ImageViewer alloc] initWithNibName:@"ImageViewer" bundle:nil] autorelease]; 
     imageView.imageURL = URL; 
     [self presentModalViewController:imageView animated:YES]; 
     return NO; 
    } else { 
     return YES; 
    } 
} 

Basta fare l'immagine di un link nell'html come faresti normalmente. Se si hanno altri collegamenti che non si desidera caricare in un modello, è possibile modificare il codice per rilevare se il collegamento da premere sta per un'immagine, altrimenti è sufficiente restituire YES;

Sto avendo un piccolo problema con la mia WebView che ho postato qui (solo in caso si ottiene il qualche problema !!) Code.

Spero che questo aiuti!

+0

scuse per la descrizione sfocata. Sto usando UICollectionView per visualizzare l'immagine nella cella e imageView si trova nella cella, quindi posso ancora espandere direttamente a schermo intero? –

+0

Ok no Probs .. aggiungendo un'altra risposta :) –

13

Ecco una soluzione abbastanza semplice. Presume che la cella della raccolta abbia UIImageView come unica sottoview di UICollectionViewCell contentView.

#import <objc/runtime.h> // for objc_setAssociatedObject/objc_getAssociatedObject 

...

- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell* cell = [collectionView cellForItemAtIndexPath:indexPath]; 

    UIImageView* iv = cell.contentView.subviews.lastObject; 

    UIImageView* ivExpand = [[UIImageView alloc] initWithImage: iv.image]; 
    ivExpand.contentMode = iv.contentMode; 
    ivExpand.frame = [self.view convertRect: iv.frame fromView: iv.superview]; 
    ivExpand.userInteractionEnabled = YES; 
    ivExpand.clipsToBounds = YES; 

    objc_setAssociatedObject(ivExpand, 
           "original_frame", 
           [NSValue valueWithCGRect: ivExpand.frame], 
           OBJC_ASSOCIATION_RETAIN); 

    [UIView transitionWithView: self.view 
         duration: 1.0 
         options: UIViewAnimationOptionAllowAnimatedContent 
        animations:^{ 

         [self.view addSubview: ivExpand]; 
         ivExpand.frame = self.view.bounds; 

        } completion:^(BOOL finished) { 

         UITapGestureRecognizer* tgr = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(onTap:)]; 
         [ivExpand addGestureRecognizer: tgr]; 
        }]; 
} 

- (void) onTap: (UITapGestureRecognizer*) tgr 
{ 
    [UIView animateWithDuration: 1.0 
        animations:^{ 

         tgr.view.frame = [objc_getAssociatedObject(tgr.view, 
                    "original_frame") CGRectValue]; 
        } completion:^(BOOL finished) { 

         [tgr.view removeFromSuperview]; 
        }]; 
} 
+0

grazie per il tuo commento, proverei questo codice ieri. ma sembra un po 'fuori dalla mia aspettativa ... dopo aver popolato il tuo codice sopra, quando tocco la foto, si espande a schermo intero, ma la mia barra delle schede e la barra di navigazione sono ancora lì, e quando faccio scorrere la finestra verso l'alto o verso il basso , la foto resta appiccicata lì. Spero che dopo che l'utente sia entrato nella modalità a schermo intero, l'utente può ancora scorrere per sfogliare altre foto. Ho sfogliato altre domande, forse quello di cui ho bisogno è passare a un altro controller di visualizzazione? Nel frattempo, spero che l'utente possa solo far scorrere una foto una volta, un piccolo rimbalzo, come una galleria fotografica integrata per iOS. –

+0

se vuoi che si sovrapponga al tuo tab e controller nav allora cambia [self.view addSubview: ivExpand]; a [self.view.window addSubview] ;. Avresti anche bisogno di aggiornare convertRect: call. Aggiungere un visualizzatore di galleria a schermo intero completo è un po 'più di lavoro, sì. – TomSwift

0

Si hai ragione, metodo delegato Usa UICollectionView:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //get UIImage from source 
    //show (add subView) UIImageView with full screen frame 
    //add gesture for double tap on which remove UIImageView 
}