Skip to content

Instantly share code, notes, and snippets.

@t-kashima
Created March 31, 2013 23:09
Show Gist options
  • Save t-kashima/5282378 to your computer and use it in GitHub Desktop.
Save t-kashima/5282378 to your computer and use it in GitHub Desktop.
//
// ListViewController.h
// opus
//
// Created by Kashima Takumi on 2013/03/28.
// Copyright (c) 2013年 UNUUU FOUNDATION. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>
@interface ListViewController : UIViewController <UIScrollViewDelegate>
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@end
//
// ListViewController.m
// opus
//
// Created by Kashima Takumi on 2013/03/28.
// Copyright (c) 2013年 UNUUU FOUNDATION. All rights reserved.
//
#import "ListViewController.h"
#import "CircleCell.h"
#import "Const.h"
@interface ListViewController ()
@property (strong, nonatomic) ALAssetsLibrary *library;
@end
@implementation ListViewController
#define kImageRadius 100
#define kBigImageRadius 300
#define kOffsetBeyondSpace 380
#define kOffsetTopSpace 80
@synthesize scrollView;
NSArray *savedAssets;
NSMutableArray *cachedImages;
CGSize screenSize;
NSMutableArray *imageViews;
BOOL finishedLoading;
NSInteger bigImageViewIndex;
- (void)viewDidLoad
{
[super viewDidLoad];
self.library = [[ALAssetsLibrary alloc] init];
cachedImages = [[NSMutableArray alloc] init];
savedAssets = [self getUserSavedAssets];
screenSize = [[UIScreen mainScreen] bounds].size;
self.scrollView.delegate = self;
imageViews = [[NSMutableArray alloc] init];
bigImageViewIndex = -1;
[self displayPhotos];
}
- (void)displayPhotos
{
finishedLoading = NO;
for (int i = 0; i < [savedAssets count]; i++) {
NSURL *assetURL = [NSURL URLWithString:[savedAssets objectAtIndex:i]];
[self.library assetForURL:assetURL
resultBlock:^(ALAsset *asset) {
if (i == ([savedAssets count] - 1)) {
finishedLoading = YES;
}
if (asset == nil || [asset defaultRepresentation] == nil) return;
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(screenSize.width / 2 - kImageRadius / 2,
kOffsetBeyondSpace + [imageViews count] * kImageRadius,
kImageRadius, kImageRadius)];
if ([cachedImages count] <= i) {
UIImage *image = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage]];
[cachedImages addObject:image];
imageView.image = image;
} else {
imageView.image = [cachedImages objectAtIndex:i];
}
[self.scrollView addSubview:imageView];
[self.scrollView setContentSize:CGSizeMake(screenSize.width,
kOffsetTopSpace * 2 + [imageViews count] * kImageRadius + kBigImageRadius)];
[imageViews addObject:imageView];
if (finishedLoading == YES) {
[self settingImageViewSize];
}
} failureBlock:nil];
}
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
[self settingImageViewSize];
// NSLog(@"scrollView:%f", self.scrollView.contentOffset.y);
}
- (void)settingImageViewSize
{
NSInteger index = [self getBigImageViewIndex:self.scrollView.contentOffset.y];
if (bigImageViewIndex != index) {
bigImageViewIndex = index;
// NSLog(@"scrollIndex:%d", bigImageViewIndex);
[self settingBigWithIndex:bigImageViewIndex];
}
}
- (NSInteger)getBigImageViewIndex:(NSInteger)offsetY
{
NSInteger index = 0;
for (int i = 0; i < [imageViews count]; i++) {
UIImageView *imageView = [imageViews objectAtIndex:i];
CGRect frame = imageView.frame;
if ((bigImageViewIndex > i &&
(frame.origin.y + frame.size.height) >= (offsetY + kOffsetTopSpace) &&
(frame.origin.y + frame.size.height) <= (offsetY + kOffsetBeyondSpace)
) ||
(bigImageViewIndex < i &&
frame.origin.y >= (offsetY + kOffsetTopSpace) &&
frame.origin.y <= (offsetY + kOffsetBeyondSpace))) {
index = i;
break;
}
}
return index;
}
- (void)settingBigWithIndex:(NSInteger)index
{
for (int i = 0; i < [imageViews count]; i++) {
UIImageView *imageView = [imageViews objectAtIndex:i];
if (i < index) {
float y = self.scrollView.contentOffset.y + kOffsetTopSpace - (index - i) * kImageRadius;
imageView.frame = CGRectMake(screenSize.width / 2 - kImageRadius / 2,
y,
kImageRadius, kImageRadius);
NSLog(@"index:%d, offsetY:%f", i, y);
} else if (i == index) {
float y = self.scrollView.contentOffset.y + kOffsetTopSpace;
imageView.frame = CGRectMake(screenSize.width / 2 - kBigImageRadius / 2,
y,
kBigImageRadius, kBigImageRadius);
} else {
float y = self.scrollView.contentOffset.y + kOffsetBeyondSpace + (i - index - 1) * kImageRadius;
imageView.frame = CGRectMake(screenSize.width / 2 - kImageRadius / 2,
y,
kImageRadius, kImageRadius);
}
}
}
- (NSArray *)getUserSavedAssets
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
return [userDefaults arrayForKey:kUserSavedAssetsKey];
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment