iOS 多图像分页和缩放问题

Posted

技术标签:

【中文标题】iOS 多图像分页和缩放问题【英文标题】:iOS Multiple Images Paging and Zooming Issues 【发布时间】:2013-01-02 19:52:34 【问题描述】:

有几个线程与此问题相关,但找不到可靠的解决方案。任何帮助,将不胜感激。如果你给它一个图像,这个代码就很好用。放大完美。你给它两个图像它滚动抛出图像很好但是当你去放大它总是放大到第一个图像?不确定为什么 viewForZoomingInScrollView 方法无法确定您在哪个视图上。代码贴在下面

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

【问题讨论】:

【参考方案1】:

这是我发现的工作。支持具有分页和缩放的多个图像。享受吧!

#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

【讨论】:

嗨,我使用的代码与您在问题中使用的代码相同,在您的独奏中,您没有告诉您制作此代码以适合您的问题代码..即在您的解决方案中,您在 viewdidload 中获取图像,但在您的问题中,您正在从 loadPage: mehthod 获取图像 .. 请帮助 .. 你能提供我的代码示例吗???

以上是关于iOS 多图像分页和缩放问题的主要内容,如果未能解决你的问题,请参考以下文章

如何创建允许 UIImageViews 分页和缩放的 UIScrollView?

UIImage 或 UIImageView 带有分页和点击缩放

启用分页的 UISCrollview

Spring Data Cassandra 中的分页和排序查询

Django - 分页和排序列表

Angular DataTable - 自定义分页和信息