2013-07-19 8 views
8

Chciałbym stworzyć aplikację na iOS podobną do Facebooka, która tworzy obraz z osi czasu na pełnym ekranie, gdy użytkownik go dotknie.W jaki sposób mogę powiększyć obraz do pełnego ekranu po dotknięciu?

Aktualizacja:

Używam UICollectionView do wyświetlania obrazu w komórce więc wydaje powinienem użyciu collectionView:didSelectItemAtIndexPath: metody? a obrazView jest w komórce, więc czy mogę nadal bezpośrednio wyświetlać na pełnym ekranie?

załączeniu kilka zdjęć poniżej:

enter image description here

enter image description here

Odpowiedz

5

użytku UITapGestureRecognizer i nie zapomnij ustawić imageView.userInteractionEnabled = YES; ponieważ domyślnie obraz nie mający 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

przeprosiny za niewyraźne opisem. Używam UICollectionView do wyświetlania obrazu w komórce, więc wydaje się, że powinienem używać metody collectionView: didSelectItemAtIndexPath: method? a obrazView jest w komórce, więc czy mogę nadal bezpośrednio wyświetlać na pełnym ekranie? –

+0

@Seraph J. Lin: tak raz sprawdź odpowiedź TomSwift. – Balu

0

Co mam rozumieć to, że masz swoje zdjęcie na UIWebView To jest to, co mam w tej chwili ustawić UIWebViews Delegata do siebie następnie dodać to:

- (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; 
    } 
} 

Wystarczy dokonać dysku A link w HTML jak normalnie. Jeśli masz inne łącza, których nie chcesz ładować w modelu, możesz zmodyfikować kod, aby wykryć, czy kliknięty link prowadzi do obrazu, czy też po prostu zwraca TAK;

Mam mały problem z moim WebView których Pisałem tutaj (tylko okrywać masz jakiś problem !!) Code.

nadzieję, że to pomaga!

+0

przeprosiny za zamazany opis. Używam UICollectionView do wyświetlania obrazu w komórce, a imageView jest w komórce, więc czy mogę nadal rozwijać się bezpośrednio na pełnym ekranie? –

+0

Ok no Probs .. dodając kolejną odpowiedź :) –

13

Oto dość podstawowe rozwiązanie. Zakłada on, że twoja komórka kolekcji ma UIImageView jako jedyny wyskok z 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

dzięki za komentarz, chciałbym spróbować tego kodu wczoraj. ale wygląda na to, że jest trochę poza moimi oczekiwaniami ... po zapełnieniu kodu powyżej, kiedy dotknę zdjęcia, rozwija się ono do pełnego ekranu, ale mój pasek zakładek i pasek nawigacji wciąż tam są, a kiedy przewijam okno w górę lub w dół , zdjęcie po prostu tam się trzyma. Mam nadzieję, że po przejściu do trybu pełnoekranowego użytkownik nadal może przesuwać palcem, aby przeglądać inne zdjęcia. Przeglądam inne pytania, może to, czego potrzebuję, to popchnąć do innego kontrolera widoku? W międzyczasie mam nadzieję, że użytkownik może przesunąć tylko jedno zdjęcie raz, trochę podskokiem, jak wbudowana galeria pełnoekranowych rolek na iOS. –

+0

jeśli chcesz nadpisać kartę i kontrolery nawigacji, zmień [self.view addSubview: ivExpand]; do [self.view.window addSubview] ;. Będziesz także musiał zaktualizować wywołanie convertRect: call. Dodanie pełnej przeglądarki pełnoekranowej to trochę więcej pracy, tak. – TomSwift

0

Ty masz rację, użyj UICollectionView jest metoda delegata:

- (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 
} 
Powiązane problemy