2012-12-05 23 views
7

Ho un UIScrollView che carica tre pagine diverse.
Quando si ingrandisce una pagina e si rimpicciolisce fino alle dimensioni originali, l'applicazione smette di farmi scorrere tra le pagine, come se il paging fosse disabilitato. Cosa posso fare per riattivare il paging quando riduci la dimensione originale (Scala == 1)?

Questo è il mio codice
Abilita il paging in UIScrollView dopo lo zoom

- (void)viewDidLoad 
{ 
    [ScView setMaximumZoomScale : 2.0f]; 
    [ScView setMinimumZoomScale : 1.0f]; 

    ScView.contentSize = CGSizeMake(1024*3, 1.0); 
    ScView.pagingEnabled = YES; 

    ScView.clipsToBounds = YES; 
    ScView.delegate = self; 

    ScView.showsHorizontalScrollIndicator = NO; 
    ScView.showsVerticalScrollIndicator = NO; 

    [super viewDidLoad]; 

    [self returnImages]; 
} 

-(void)returnImages{ 
    for (pageNumber = 1; pageNumber <= 3; pageNumber++) { 
     imagen = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"%d.png",pageNumber]]]; 
     imagen.frame = CGRectMake((pageNumber-1)*1024, 0, 1024, 768); 

     [ScView addSubview:imagen]; 
    } 
} 

// 
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{ 
     return ScView; 
    // return [imagen initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"%d.png",pageNumber]]]; 
} 

- (void)scrollViewWillBeginZooming:(UIScrollView *)myScrollView withView:(UIView *)view 
{ 
    NSLog(@"Scroll Will Begin"); 
    ScView.scrollEnabled = YES; 
} 

- (void)scrollViewDidEndZooming:(UIScrollView *)myScrollView withView:(UIView *)view atScale:(float)scale 
{ 
    if(scale == 1) 
    { 
     ScView.scrollEnabled = YES; 
     ScView.pagingEnabled = YES; 
     [self returnImages]; 
     NSLog(@"Scrolol will end"); 
     //ScView.maximumZoomScale = 2.0f; 
     // [super viewDidLoad]; 

     [self returnImages]; 
    } 
} 

Tutte le idee saranno molto apprezzati ..

risposta

18

Per ottenere una corretta impaginazione e zoom hanno incorporare UIScrollView per ogni pagina nel vostro UIScrollView genitore. Questa combinazione ti consentirà di utilizzare contemporaneamente il paging e lo scorrimento interno.

Ecco l'esempio di UIViewController con visualizzazione a scorrimento padre e tre pagine zoomabili incorporate.

#define VIEW_FOR_ZOOM_TAG (1) 

@implementation SVViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIScrollView *mainScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; 
    mainScrollView.pagingEnabled = YES; 
    mainScrollView.showsHorizontalScrollIndicator = NO; 
    mainScrollView.showsVerticalScrollIndicator = NO; 

    CGRect innerScrollFrame = mainScrollView.bounds; 

    for (NSInteger i = 0; i < 3; i++) { 
     UIImageView *imageForZooming = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"page%d", i + 1]]]; 
     imageForZooming.tag = VIEW_FOR_ZOOM_TAG; 

     UIScrollView *pageScrollView = [[UIScrollView alloc] initWithFrame:innerScrollFrame]; 
     pageScrollView.minimumZoomScale = 1.0f; 
     pageScrollView.maximumZoomScale = 2.0f; 
     pageScrollView.zoomScale = 1.0f; 
     pageScrollView.contentSize = imageForZooming.bounds.size; 
     pageScrollView.delegate = self; 
     pageScrollView.showsHorizontalScrollIndicator = NO; 
     pageScrollView.showsVerticalScrollIndicator = NO; 
     [pageScrollView addSubview:imageForZooming]; 

     [mainScrollView addSubview:pageScrollView]; 

     if (i < 2) { 
      innerScrollFrame.origin.x += innerScrollFrame.size.width; 
     } 
    } 

    mainScrollView.contentSize = CGSizeMake(innerScrollFrame.origin.x + innerScrollFrame.size.width, mainScrollView.bounds.size.height); 

    [self.view addSubview:mainScrollView]; 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    return [scrollView viewWithTag:VIEW_FOR_ZOOM_TAG]; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 

- (BOOL)shouldAutorotate { 
    return NO; 
} 

@end 
2

seguo soluzione s' @NikNarmo, scrivere un piccolo progetto rapido Xcode di demo la funzione di zoom e il paging.

Spero di aiutare chiunque desideri svolgere lo stesso compito.

Alcuni codice è da UIScrollView Tutorial: Introduzione http://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift,

e alcuni da Guida per principianti alla UIScrollView http://www.appcoda.com/uiscrollview-introduction/.

Utilizzando Xcode 7.0 e Swift 2,0

override func viewDidLoad() { 

    super.viewDidLoad() 

    mainScrollView = UIScrollView(frame: self.view.bounds) 
    mainScrollView.pagingEnabled = true 
    mainScrollView.showsHorizontalScrollIndicator = false 
    mainScrollView.showsVerticalScrollIndicator = false 

    pageScrollViews = [UIScrollView?](count: photos.count, repeatedValue: nil) 

    let innerScrollFrame = mainScrollView.bounds 

    mainScrollView.contentSize = 
     CGSizeMake(innerScrollFrame.origin.x + innerScrollFrame.size.width, 
      mainScrollView.bounds.size.height) 

    mainScrollView.backgroundColor = UIColor.redColor() 
    mainScrollView.delegate = self 
    self.view.addSubview(mainScrollView) 

    configScrollView() 
    addPageControlOnScrollView() 
} 

e la magia è nel scrollViewWillEndDragging func, quando il contentSize è uguale al mainScrollViewContentSize o no, se è mainScrollViewController, poi fare di paging, altrimenti non fare nulla.

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 

    let targetOffset = targetContentOffset.memory.x 
    let zoomRatio = scrollView.contentSize.height/mainScrollViewContentSize.height 

    if zoomRatio == 1 { 
     // mainScrollViewController 
     let mainScrollViewWidthPerPage = mainScrollViewContentSize.width/CGFloat(pageControl.numberOfPages) 

     let currentPage = targetOffset/(mainScrollViewWidthPerPage * zoomRatio) 
     pageControl.currentPage = Int(currentPage) 
     loadVisiblePages() 

    } 
    else { 
     // pageScorllViewController 
    } 
} 

Ed ecco il codice del progetto https://github.com/Charles-Hsu/ScrollViewDemo

+0

Come collegare il codice Swift a storyboard? Ho scaricato l'intero codice del progetto ma ho notato che lo storyboard è solo un controller di visualizzazione. – user2872856

+0

Questa è la mia domanda: http://stackoverflow.com/questions/34449359/zoom-images-in-paged-uiscrollview – user2872856

+0

Problema risolto. Grazie per il tuo codice. – user2872856