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 メソッドの前に 呼び出しますが、この時点ではor viewDidLoadの実際の値は期待できません。 in/after で呼び出す必要があります。多分このように:self.view.frameself.pageScrollView.frameviewDidLoad

    [self presentViewController:photosViewController animated:YES completion:^{
        [photoViewController creatContentWithImages:images andCurrentPage:row];
    }];
    
  • サイクルでは、 ivarcurrentPageの代わりに常に使用しますi

  • メソッドに送信imageArrayしますcreatContentWithNumerOfPage
    、何らかの理由で、この配列はここで新しいデータでオーバーライドされています(
    同じデータであると思います)
  • また、実行する理由も不明です- UIScrollView はプログラムで作成されていますか? しかし、それはどの場所で起こりますか?[self.view addSubview:
    pageScrollView]
  • フレームを操作する場合は、UIView ではなく UIScrollView フレームを使用する必要があります。スクロール サイズが 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 に答える