Add aspect fill and fit as separate functions

This commit is contained in:
Tony DiPasquale 2015-04-23 18:30:57 -04:00
parent f57f725147
commit a9963e3b01
1 changed files with 38 additions and 3 deletions

View File

@ -6,14 +6,31 @@ extension UIImage {
/// :param: size The new size of the image. /// :param: size The new size of the image.
/// :returns: A new resized image instance. /// :returns: A new resized image instance.
func resize(size: CGSize) -> UIImage { func resize(size: CGSize) -> UIImage {
let newSize = self.size.sizeConstrainedBySize(size) UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
UIGraphicsBeginImageContext(newSize) self.drawInRect(CGRect(origin: CGPointZero, size: size))
self.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
let newImage = UIGraphicsGetImageFromCurrentImageContext() let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext() UIGraphicsEndImageContext()
return newImage return newImage
} }
/// Resizes an image instance to fit inside a constraining size while keeping the aspect ratio.
///
/// :param: size The constraining size of the image.
/// :returns: A new resized image instance.
func resizeAspectFit(size: CGSize) -> UIImage {
let newSize = self.size.sizeConstrainedBySize(size)
return resize(newSize)
}
/// Resizes an image instance to fill a constraining size while keeping the aspect ratio.
///
/// :param: size The constraining size of the image.
/// :returns: A new resized image instance.
func resizeAspectFill(size: CGSize) -> UIImage {
let newSize = self.size.sizeFillingSize(size)
return resize(newSize)
}
/// Returns a new `UIImage` instance using raw image data and a size. /// Returns a new `UIImage` instance using raw image data and a size.
/// ///
/// :param: data Raw image data. /// :param: data Raw image data.
@ -50,4 +67,22 @@ private extension CGSize {
return CGSize(width: aspectWidth, height: size.height) return CGSize(width: aspectWidth, height: size.height)
} }
} }
/// Finds a new size filling the given size while keeping the aspect ratio.
///
/// :param: size The contraining size.
/// :returns: size A new size that fills the contraining size keeping the same aspect ratio.
func sizeFillingSize(size: CGSize) -> CGSize {
if height == 0 { return size }
let aspectRatio = width / height
let aspectWidth = round(aspectRatio * size.height)
let aspectHeight = round(size.width / aspectRatio)
if aspectWidth > size.width {
return CGSize(width: aspectWidth, height: size.height)
} else {
return CGSize(width: size.width, height: aspectHeight)
}
}
} }