123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- //
- // MWGridCell.m
- // MWPhotoBrowser
- //
- // Created by Michael Waterfall on 08/10/2013.
- //
- //
- #import "DACircularProgressView.h"
- #import "MWGridCell.h"
- #import "MWCommon.h"
- #import "MWPhotoBrowserPrivate.h"
- #import "UIImage+MWPhotoBrowser.h"
- #define VIDEO_INDICATOR_PADDING 10
- @interface MWGridCell () {
-
- UIImageView *_imageView;
- UIImageView *_videoIndicator;
- UIImageView *_loadingError;
- DACircularProgressView *_loadingIndicator;
- UIButton *_selectedButton;
-
- }
- @end
- @implementation MWGridCell
- - (id)initWithFrame:(CGRect)frame {
- if ((self = [super initWithFrame:frame])) {
- // Grey background
- self.backgroundColor = [UIColor colorWithWhite:0.12 alpha:1];
-
- // Image
- _imageView = [UIImageView new];
- _imageView.frame = self.bounds;
- _imageView.contentMode = UIViewContentModeScaleAspectFill;
- _imageView.clipsToBounds = YES;
- _imageView.autoresizesSubviews = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
- [self addSubview:_imageView];
-
- // Video Image
- _videoIndicator = [UIImageView new];
- _videoIndicator.hidden = NO;
- UIImage *videoIndicatorImage = [UIImage imageForResourcePath:@"MWPhotoBrowser.bundle/VideoOverlay" ofType:@"png" inBundle:[NSBundle bundleForClass:[self class]]];
- _videoIndicator.frame = CGRectMake(self.bounds.size.width - videoIndicatorImage.size.width - VIDEO_INDICATOR_PADDING, self.bounds.size.height - videoIndicatorImage.size.height - VIDEO_INDICATOR_PADDING, videoIndicatorImage.size.width, videoIndicatorImage.size.height);
- _videoIndicator.image = videoIndicatorImage;
- _videoIndicator.autoresizesSubviews = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
- [self addSubview:_videoIndicator];
-
- // Selection button
- _selectedButton = [UIButton buttonWithType:UIButtonTypeCustom];
- _selectedButton.contentMode = UIViewContentModeTopRight;
- _selectedButton.adjustsImageWhenHighlighted = NO;
- [_selectedButton setImage:[UIImage imageForResourcePath:@"MWPhotoBrowser.bundle/ImageSelectedSmallOff" ofType:@"png" inBundle:[NSBundle bundleForClass:[self class]]] forState:UIControlStateNormal];
- [_selectedButton setImage:[UIImage imageForResourcePath:@"MWPhotoBrowser.bundle/ImageSelectedSmallOn" ofType:@"png" inBundle:[NSBundle bundleForClass:[self class]]] forState:UIControlStateSelected];
- [_selectedButton addTarget:self action:@selector(selectionButtonPressed) forControlEvents:UIControlEventTouchDown];
- _selectedButton.hidden = YES;
- _selectedButton.frame = CGRectMake(0, 0, 44, 44);
- [self addSubview:_selectedButton];
-
- // Loading indicator
- _loadingIndicator = [[DACircularProgressView alloc] initWithFrame:CGRectMake(0, 0, 40.0f, 40.0f)];
- _loadingIndicator.userInteractionEnabled = NO;
- _loadingIndicator.thicknessRatio = 0.1;
- _loadingIndicator.roundedCorners = NO;
- [self addSubview:_loadingIndicator];
-
- // Listen for photo loading notifications
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(setProgressFromNotification:)
- name:MWPHOTO_PROGRESS_NOTIFICATION
- object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(handleMWPhotoLoadingDidEndNotification:)
- name:MWPHOTO_LOADING_DID_END_NOTIFICATION
- object:nil];
-
- }
- return self;
- }
- - (void)dealloc {
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- }
- - (void)setGridController:(MWGridViewController *)gridController {
- _gridController = gridController;
- // Set custom selection image if required
- if (_gridController.browser.customImageSelectedSmallIconName) {
- [_selectedButton setImage:[UIImage imageNamed:_gridController.browser.customImageSelectedSmallIconName] forState:UIControlStateSelected];
- }
- }
- #pragma mark - View
- - (void)layoutSubviews {
- [super layoutSubviews];
- _imageView.frame = self.bounds;
- _loadingIndicator.frame = CGRectMake(floorf((self.bounds.size.width - _loadingIndicator.frame.size.width) / 2.),
- floorf((self.bounds.size.height - _loadingIndicator.frame.size.height) / 2),
- _loadingIndicator.frame.size.width,
- _loadingIndicator.frame.size.height);
- _selectedButton.frame = CGRectMake(self.bounds.size.width - _selectedButton.frame.size.width - 0,
- 0, _selectedButton.frame.size.width, _selectedButton.frame.size.height);
- }
- #pragma mark - Cell
- - (void)prepareForReuse {
- _photo = nil;
- _gridController = nil;
- _imageView.image = nil;
- _loadingIndicator.progress = 0;
- _selectedButton.hidden = YES;
- [self hideImageFailure];
- [super prepareForReuse];
- }
- #pragma mark - Image Handling
- - (void)setPhoto:(id <MWPhoto>)photo {
- _photo = photo;
- if ([photo respondsToSelector:@selector(isVideo)]) {
- _videoIndicator.hidden = !photo.isVideo;
- } else {
- _videoIndicator.hidden = YES;
- }
- if (_photo) {
- if (![_photo underlyingImage]) {
- [self showLoadingIndicator];
- } else {
- [self hideLoadingIndicator];
- }
- } else {
- [self showImageFailure];
- }
- }
- - (void)displayImage {
- _imageView.image = [_photo underlyingImage];
- _selectedButton.hidden = !_selectionMode;
- [self hideImageFailure];
- }
- #pragma mark - Selection
- - (void)setSelectionMode:(BOOL)selectionMode {
- _selectionMode = selectionMode;
- }
- - (void)setIsSelected:(BOOL)isSelected {
- _isSelected = isSelected;
- _selectedButton.selected = isSelected;
- }
- - (void)selectionButtonPressed {
- _selectedButton.selected = !_selectedButton.selected;
- [_gridController.browser setPhotoSelected:_selectedButton.selected atIndex:_index];
- }
- #pragma mark - Touches
- - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
- _imageView.alpha = 0.6;
- [super touchesBegan:touches withEvent:event];
- }
- - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- _imageView.alpha = 1;
- [super touchesEnded:touches withEvent:event];
- }
- - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
- _imageView.alpha = 1;
- [super touchesCancelled:touches withEvent:event];
- }
- #pragma mark Indicators
- - (void)hideLoadingIndicator {
- _loadingIndicator.hidden = YES;
- }
- - (void)showLoadingIndicator {
- _loadingIndicator.progress = 0;
- _loadingIndicator.hidden = NO;
- [self hideImageFailure];
- }
- - (void)showImageFailure {
- // Only show if image is not empty
- if (![_photo respondsToSelector:@selector(emptyImage)] || !_photo.emptyImage) {
- if (!_loadingError) {
- _loadingError = [UIImageView new];
- _loadingError.image = [UIImage imageForResourcePath:@"MWPhotoBrowser.bundle/ImageError" ofType:@"png" inBundle:[NSBundle bundleForClass:[self class]]];
- _loadingError.userInteractionEnabled = NO;
- [_loadingError sizeToFit];
- [self addSubview:_loadingError];
- }
- _loadingError.frame = CGRectMake(floorf((self.bounds.size.width - _loadingError.frame.size.width) / 2.),
- floorf((self.bounds.size.height - _loadingError.frame.size.height) / 2),
- _loadingError.frame.size.width,
- _loadingError.frame.size.height);
- }
- [self hideLoadingIndicator];
- _imageView.image = nil;
- }
- - (void)hideImageFailure {
- if (_loadingError) {
- [_loadingError removeFromSuperview];
- _loadingError = nil;
- }
- }
- #pragma mark - Notifications
- - (void)setProgressFromNotification:(NSNotification *)notification {
- dispatch_async(dispatch_get_main_queue(), ^{
- NSDictionary *dict = [notification object];
- id <MWPhoto> photoWithProgress = [dict objectForKey:@"photo"];
- if (photoWithProgress == _photo) {
- // NSLog(@"%f", [[dict valueForKey:@"progress"] floatValue]);
- float progress = [[dict valueForKey:@"progress"] floatValue];
- _loadingIndicator.progress = MAX(MIN(1, progress), 0);
- }
- });
- }
- - (void)handleMWPhotoLoadingDidEndNotification:(NSNotification *)notification {
- id <MWPhoto> photo = [notification object];
- if (photo == _photo) {
- if ([photo underlyingImage]) {
- // Successful load
- [self displayImage];
- } else {
- // Failed to load
- [self showImageFailure];
- }
- [self hideLoadingIndicator];
- }
- }
- @end
|