// // VIAnimatableImageView.m // VIAnimatableImageViewDemo // // Created by Vito on 12/30/14. // Copyright (c) 2014 Vito. All rights reserved. // project can be found at: https://github.com/vitoziv/VICMAImageView #import "VICMAImageView.h" @interface VICMAImageView () @property (nonatomic, strong) UIImageView *imageView; @end @implementation VICMAImageView - (void)commonInit { self.clipsToBounds = YES; self.contentMode = UIViewContentModeScaleAspectFit; if (!_imageView) { UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.frame]; imageView.contentMode = UIViewContentModeScaleToFill; [self addSubview:imageView]; _imageView = imageView; } } - (instancetype)initWithImage:(UIImage *)image { self = [super init]; if (self) { [self commonInit]; _imageView.image = image; } return self; } - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self commonInit]; } return self; } - (instancetype)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self commonInit]; } return self; } - (CGSize)presentationImageSize { return self.imageView.bounds.size; } - (void)setImage:(UIImage *)image { self.imageView.image = image; [self updateView]; } - (UIImage *)image { return self.imageView.image; } - (void)setFrame:(CGRect)frame { [super setFrame:frame]; [self updateView]; } - (void)setContentMode:(UIViewContentMode)contentMode { [super setContentMode:contentMode]; [self updateView]; } - (void)updateView { if (self.bounds.size.width == 0 || self.bounds.size.height == 0 || self.image.size.width == 0 || self.image.size.height == 0) { return; } switch (self.contentMode) { case UIViewContentModeScaleAspectFit: [self updateViewToAspectFit]; break; case UIViewContentModeScaleAspectFill: [self updateViewToAspectFill]; break; case UIViewContentModeScaleToFill: [self updateViewToScaleToFill]; break; case UIViewContentModeCenter: [self updateViewToCenter]; break; case UIViewContentModeBottom: [self updateViewToBottom]; break; case UIViewContentModeBottomLeft: [self updateViewToBottomLeft]; break; case UIViewContentModeBottomRight: [self updateViewToBottomRight]; break; case UIViewContentModeLeft: [self updateViewToLeft]; break; case UIViewContentModeRight: [self updateViewToRight]; break; case UIViewContentModeTop: [self updateViewToTop]; break; case UIViewContentModeTopLeft: [self updateViewToTopLeft]; break; case UIViewContentModeTopRight: [self updateViewToTopRight]; break; case UIViewContentModeRedraw: [self updateViewToScaleToFill]; break; default: break; } } - (void)updateViewToAspectFit { CGSize imageSize = CGSizeMake(self.imageView.image.size.width / self.imageView.image.scale, self.imageView.image.size.height / self.imageView.image.scale); CGFloat widthRatio = imageSize.width / self.bounds.size.width; CGFloat heightRatio = imageSize.height / self.bounds.size.height; if (widthRatio > heightRatio) { imageSize = CGSizeMake(imageSize.width / widthRatio, imageSize.height / widthRatio); } else { imageSize = CGSizeMake(imageSize.width / heightRatio, imageSize.height / heightRatio); } self.imageView.bounds = CGRectMake(0, 0, imageSize.width, imageSize.height); self.imageView.center = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2); } - (void)updateViewToAspectFill { CGSize imageSize = CGSizeMake(self.imageView.image.size.width / self.imageView.image.scale, self.imageView.image.size.height / self.imageView.image.scale); CGFloat widthRatio = imageSize.width / self.bounds.size.width; CGFloat heightRatio = imageSize.height / self.bounds.size.height; if (widthRatio > heightRatio) { imageSize = CGSizeMake(imageSize.width / heightRatio, imageSize.height / heightRatio); } else { imageSize = CGSizeMake(imageSize.width / widthRatio, imageSize.height / widthRatio); } self.imageView.bounds = CGRectMake(0, 0, imageSize.width, imageSize.height); [self centerImageViewToSuperView]; } - (void)updateViewToScaleToFill { self.imageView.bounds = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height); [self centerImageViewToSuperView]; } - (void)updateViewToCenter { [self fitImageViewSizeToImageSize]; [self centerImageViewToSuperView]; } - (void)updateViewToBottom { [self fitImageViewSizeToImageSize]; self.imageView.center = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height - self.image.size.height / 2); } - (void)updateViewToBottomLeft { [self fitImageViewSizeToImageSize]; self.imageView.center = CGPointMake(self.image.size.width / 2, self.bounds.size.height - self.image.size.height / 2); } - (void)updateViewToBottomRight { [self fitImageViewSizeToImageSize]; self.imageView.center = CGPointMake(self.bounds.size.width - self.image.size.width / 2, self.bounds.size.height - self.image.size.height / 2); } - (void)updateViewToLeft { [self fitImageViewSizeToImageSize]; self.imageView.center = CGPointMake(self.image.size.width / 2, self.bounds.size.height / 2); } - (void)updateViewToRight { [self fitImageViewSizeToImageSize]; self.imageView.center = CGPointMake(self.bounds.size.width - self.image.size.width / 2, self.bounds.size.height / 2); } - (void)updateViewToTop { [self fitImageViewSizeToImageSize]; self.imageView.center = CGPointMake(self.bounds.size.width / 2, self.image.size.height / 2); } - (void)updateViewToTopLeft { [self fitImageViewSizeToImageSize]; self.imageView.center = CGPointMake(self.image.size.width / 2, self.image.size.height / 2); } - (void)updateViewToTopRight { [self fitImageViewSizeToImageSize]; self.imageView.center = CGPointMake(self.bounds.size.width - self.image.size.width / 2, self.image.size.height / 2); } #pragma mark - Helper - (void)fitImageViewSizeToImageSize { CGSize imageSize = CGSizeMake(self.imageView.image.size.width / self.imageView.image.scale, self.imageView.image.size.height / self.imageView.image.scale); self.imageView.bounds = CGRectMake(0, 0, imageSize.width, imageSize.height); } - (void)centerImageViewToSuperView { self.imageView.center = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2); } @end