3

我创建了一个画廊UICollectionView,并从 plist 文件加载一组图像,当用户触摸每个单元格时,将加载全屏图像(与 iPhone 的照片应用程序相同),所以我遇到了一个问题,即照片何时会全屏我无法滚动和查看其他图像,这是我的代码:

然后在 PhotosViewerController 中:

-(void) creatContentWithNumerOfPage: (NSInteger) numberOfPage andCurrentPage: (NSInteger) currentPage andImageArray:(NSArray *)imageArray {

    self.pageControl.numberOfPages = numberOfPage;
    self.pageControl.currentPage = currentPage;
    [pageScrollView setContentSize:CGSizeMake(self.view.frame.size.width * pageControl.numberOfPages, self.view.frame.size.height)];
    pageScrollView.delegate = self;
    [self.view addSubview: pageScrollView];


    NSMutableArray *mArray = [[NSMutableArray alloc] initWithCapacity:thumbnailViewController.imageArray.count];
    for (int i = 0; i <= thumbnailViewController.imageArray.count; i++)
    {

        NSDictionary *picturesDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Photos" ofType:@"plist"]];
        imageArray = [picturesDictionary objectForKey:@"PhotosArray"];

        fullScreen = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[imageArray objectAtIndex:currentPage]]];
        [fullScreen setContentMode:UIViewContentModeScaleAspectFit];
        fullScreen.frame = self.view.frame;

        [mArray addObject:fullScreen];
        [pageScrollView addSubview:fullScreen];
    }

}

编辑:(解决方案)

-(void) creatContentWithImages:(NSArray*)imageArray andCurrentPage:(NSInteger)currentPage{

    self.pageControl.numberOfPages = imageArray.count;
    self.pageControl.currentPage = currentPage;
    [self.pageScrollView setContentSize:CGSizeMake(self.pageScrollView.frame.size.width * imageArray.count, self.pageScrollView.frame.size.height)];


    for (int i = 0; i < imageArray.count; i++)
    {


        NSDictionary *picturesDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Photos" ofType:@"plist"]];
        imageArray = [picturesDictionary objectForKey:@"PhotosArray"];

        fullScreen = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[imageArray objectAtIndex:i]]];


        [fullScreen setContentMode:UIViewContentModeScaleAspectFit];
        fullScreen.frame = CGRectMake(i*self.pageScrollView.frame.size.width, 0, self.pageScrollView.frame.size.width, self.pageScrollView.frame.size.height);

        [self.pageScrollView addSubview:fullScreen];
    }

    [self scrollToPage:currentPage animated:NO];

}
4

1 回答 1

2

您的代码有很多问题,例如

  • 您调用creatContentWithImages before viewDidLoad方法,此时我们不能指望self.view.frameor 的实际值self.pageScrollView.frame,您必须在 in/after 调用它viewDidLoad。也许是这样的:

    [self presentViewController:photosViewController animated:YES completion:^{
        [photoViewController creatContentWithImages:images andCurrentPage:row];
    }];
    
  • 在循环中,您总是使用currentPage而不是iivar

  • 你发送imageArraycreatContentWithNumerOfPage方法,但
    由于某种原因,这个数组在这里被新数据覆盖(我
    想用相同的数据)
  • 也不清楚你为什么要执行- UIScrollView 是否以编程方式创建?但它发生在哪个地方?[self.view addSubview:
    pageScrollView]
  • 当您使用框架进行操作时,您应该使用 UIScrollView 框架,而不是 UIView,如果您的滚动大小与 UIView 不同,那么
    设计也会被破坏。

我已经改变了它并改进了一些东西,所以让我们看看这个(我发布了所有整个 PhotosViewerController.m 文件)

#import "PhotosViewerController.h"
@implementation PhotosViewerController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void) creatContentWithImages:(NSArray*)imageArray andCurrentPage:(NSInteger)currentPage{
// I create UIScrollView programmatically, if you want to use xib then just remove lines with RM comment. 
// There are two views in xib hierarchy - UIScrollView downward and UIPageView above

    self.pageScrollView = [[UIScrollView alloc] initWithFrame:self.view.frame]; //RM
    self.pageScrollView.pagingEnabled = YES; //RM

    self.pageControl.numberOfPages = imageArray.count;
    self.pageControl.currentPage = currentPage;
    [self.pageScrollView setContentSize:CGSizeMake(self.pageScrollView.frame.size.width * imageArray.count, self.pageScrollView.frame.size.height)];

    self.pageScrollView.delegate = self;//RM
    [self.view insertSubview:self.pageScrollView atIndex:0]; //RM

    for (int i = 0; i < imageArray.count; i++) //not <=, just <
    {
        UIImage *img = [imageArray objectAtIndex:i];// not sure whether imageArray contains UIImage's or NSString, so if here NSString the create UIImage in appropriate manner. I've tested it with UIImage's 
        UIImageView *fullScreen = [[UIImageView alloc] initWithImage:img];
        [fullScreen setContentMode:UIViewContentModeScaleAspectFit];
        fullScreen.frame = CGRectMake(i*self.pageScrollView.frame.size.width, 0, self.pageScrollView.frame.size.width, self.pageScrollView.frame.size.height);

        [self.pageScrollView addSubview:fullScreen];
    }

    [self scrollToPage:currentPage animated:NO]; // scroll to corresponding page
}

- (void)scrollViewDidScroll: (UIScrollView *) sView
{
    CGFloat offset = self.pageScrollView.contentOffset.x;
    CGFloat pageSize = self.pageScrollView.frame.size.width;

    int page = floor((offset + (pageSize/2)) / pageSize);
    self.pageControl.currentPage = page;
}

- (IBAction)changeThePage:(id)sender
{
    NSLog(@"Change");
    [self scrollToPage:self.pageControl.currentPage animated:YES];
}

- (void)scrollToPage:(NSInteger)page animated:(BOOL)animated{
    CGRect pageRect = CGRectMake(page * self.pageScrollView.frame.size.width, 0, self.pageScrollView.frame.size.width, self.pageScrollView.frame.size.height);    
    [self.pageScrollView scrollRectToVisible: pageRect animated: animated];

    [self.pageControl setCurrentPage:page];
}
@end

如果您仍有任何问题,请告诉我,我会尽力帮助您。

于 2012-12-01T14:59:35.677 回答