2013-01-02 23 views
1

有幾個線程與此問題相關,但找不到一個可靠的解決方案。任何幫助,將不勝感激。如果你給它一個圖像,這個代碼很好用。放大完美。你給它兩個圖像,它滾動扔圖像很好,但當你放大它總是放大到第一個圖像?不知道爲什麼viewForZoomingInScrollView方法不知道你在哪個視圖上。代碼下面貼iOS多圖片分頁和縮放問題

PagedScrollViewController.h

#import <UIKit/UIKit.h> 
@interface PagedScrollViewController : UIViewController <UIScrollViewDelegate> 
@property (nonatomic, strong) IBOutlet UIScrollView *scrollView; 
@property (nonatomic, strong) IBOutlet UIPageControl *pageControl; 
@property (nonatomic, strong) IBOutlet UIButton *cancelButtonClicked; 
@property (nonatomic, strong) IBOutlet UILabel *headerTitle; 
@property (nonatomic, strong) IBOutlet NSString *headerTitleS; 
@property (nonatomic, strong) IBOutlet NSMutableArray *pageImages; 
@property (nonatomic, strong) IBOutlet UITextView *caption; 
@property (weak, nonatomic) IBOutlet UINavigationBar *navigationBar; 
@property (nonatomic, strong) NSMutableArray *captionArray; 

-(IBAction)cancelButtonClicked:(id)sender; 

@end 

PagedScrollViewController.m

@interface PagedScrollViewController() 
@property (nonatomic, strong) NSMutableArray *pageViews; 

- (void)loadVisiblePages; 
- (void)loadPage:(NSInteger)page; 
- (void)purgePage:(NSInteger)page; 
@end 

@implementation PagedScrollViewController 
@synthesize scrollView = _scrollView; 
@synthesize pageControl = _pageControl; 
@synthesize pageImages = _pageImages; 
@synthesize pageViews = _pageViews; 
@synthesize cancelButtonClicked = _cancelButtonClicked; 
@synthesize headerTitle = _headerTitle; 
@synthesize headerTitleS = _headerTitleS; 
@synthesize caption = _caption; 
@synthesize captionArray = _captionArray; 

- (void)loadVisiblePages { 
    // First, determine which page is currently visible 
    CGFloat pageWidth = self.scrollView.frame.size.width; 
    NSInteger page = (NSInteger)floor((self.scrollView.contentOffset.x * 2.0f + pageWidth) 
    /(pageWidth * 2.0f)); 

    // Update the page control 
    self.pageControl.currentPage = page; 

    NSObject *captionObject = [self.captionArray objectAtIndex:page]; 
    NSString *captionString = [NSString stringWithFormat:@"%@", [captionObject 
    valueForKey:@"caption"]]; 
    self.caption.text = captionString; 

    // Work out which pages we want to load 
    NSInteger firstPage = page - 1; 
    NSInteger lastPage = page + 1; 

    // Purge anything before the first page 
    for (NSInteger i=0; i<firstPage; i++) { 
     [self purgePage:i]; 
    } 
     for (NSInteger i=firstPage; i<=lastPage; i++) { 
     [self loadPage:i]; 
    } 
    for (NSInteger i=lastPage+1; i<self.pageImages.count; i++) { 
     [self purgePage:i]; 
    } 
} 

- (void)loadPage:(NSInteger)page { 
    if (page < 0 || page >= self.pageImages.count) { 
     // If it's outside the range of what we have to display, then do nothing 
     return; 
    } 

    // Load an individual page, first seeing if we've already loaded it 
    UIView *pageView = [self.pageViews objectAtIndex:page]; 
    if ((NSNull*)pageView == [NSNull null]) { 
     CGRect frame = self.scrollView.bounds; 
     frame.origin.x = frame.size.width * page; 
     frame.origin.y = 0.0f; 

     UIImageView *newPageView = [[UIImageView alloc] initWithImage:[self.pageImages 
     objectAtIndex:page]]; 

     newPageView.contentMode = UIViewContentModeScaleAspectFit; 
     newPageView.frame = CGRectMake((page*320), 0, 310, 320); 
     self.scrollView.maximumZoomScale = 1.3; 
     self.scrollView.contentSize = CGSizeMake(320*[self.pageImages count],389); 
     self.scrollView.frame = CGRectMake(320*(self.pageControl.currentPage), 44, 310, 
     370); 
     [self.scrollView addSubview:newPageView]; 
     [self.pageViews replaceObjectAtIndex:page withObject:newPageView]; 
    } 
} 

- (void)purgePage:(NSInteger)page { 
if (page < 0 || page >= self.pageImages.count) { 
    // If it's outside the range of what we have to display, then do nothing 
    return; 
} 

// Remove a page from the scroll view and reset the container array 
UIView *pageView = [self.pageViews objectAtIndex:page]; 
    if ((NSNull*)pageView != [NSNull null]) { 
     [pageView removeFromSuperview]; 
     [self.pageViews replaceObjectAtIndex:page withObject:[NSNull null]]; 
    } 
} 

-(UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView { 
     self.scrollView.contentSize = CGSizeMake(320*[self.pageImages count],389); 
    return [self.scrollView.subviews objectAtIndex:self.pageControl.currentPage]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.scrollView.delegate = self; 
    self.headerTitle.text = self.headerTitleS; 
    // Set up the image we want to scroll & zoom and add it to the scroll view 
    NSInteger pageCount = self.pageImages.count; 

    // Set up the page control 
    self.pageControl.currentPage = 0; 
    self.pageControl.numberOfPages = pageCount; 

    // Set up the array to hold the views for each page 
    self.pageViews = [[NSMutableArray alloc] init]; 
    for (NSInteger i = 0; i < pageCount; ++i) { 
    [self.pageViews addObject:[NSNull null]]; 
    } 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    // Load the initial set of pages that are on screen 
    [self loadVisiblePages]; 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    self.scrollView = nil; 
    self.pageControl = nil; 
    self.pageImages = nil; 
    self.pageViews = nil; 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    [self loadVisiblePages]; 
} 

-(IBAction)cancelButtonClicked:(id)sender{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

@end 

回答

12

這是我找到的工作。通過分頁和縮放支持多個圖像。請享用!

#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 
+0

嗨,我使用相同的代碼,你在你的quesn使用,在你的solotion你沒有告訴你這代碼來適應你的quesn ..即在這裏您的解決方案的代碼,你[R獲取圖像在viewdidload但在你的問題你正在從loadPage獲取圖像:meththod ..請幫助..你能提供我的代碼示例? – Rakesh

+0

這不起作用。 – Rajesh