【问题标题】:iOS - Scrolling Images from plist dataiOS - 从 plist 数据滚动图像
【发布时间】:2012-11-29 13:23:31
【问题描述】:

我用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 个金和 15 个银徽章和 3 个代表的......然后我明白了。
  • @H2CO3 那是什么?!!
  • 你有 500 个,但赏金拿走了一切 :)

标签: iphone objective-c ios xcode ipad


【解决方案1】:

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

  • 您调用creatContentWithImages 之前 viewDidLoad 方法并在此 点我们不能指望self.view.frame 的实际值或 self.pageScrollView.frame,您必须在viewDidLoad 中/之后调用它。 可能是这样的:

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

  • 您将imageArray 发送到creatContentWithNumerOfPage 方法中,但是
    由于某种原因,这个数组在这里被新数据覆盖(I
    假设使用相同的数据)
  • 还不清楚您为什么执行[self.view addSubview:
    pageScrollView]
    - UIScrollView 是通过编程方式创建的吗?但它发生在哪个地方?
  • 当您使用框架进行操作时,您应该使用 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

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

【讨论】:

  • 谢谢!!!!但我稍微更改了您的代码:D 查看我编辑的代码,现在可以正常工作了!
猜你喜欢
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 2015-03-17
相关资源
最近更新 更多