Created
January 29, 2019 20:02
-
-
Save mcany/69edd7e02ff536b0c6fd69d8e85eb578 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
The final interface is as simple as this: | |
image.scaled(to: size) | |
image.scaled(to: size, scalingMode: .aspectFill) | |
image.scaled(to: size, scalingMode: .aspectFit) | |
.. and is implemented like this: | |
// MARK: - Image Scaling. | |
extension UIImage { | |
/// Represents a scaling mode | |
enum ScalingMode { | |
case aspectFill | |
case aspectFit | |
/// Calculates the aspect ratio between two sizes | |
/// | |
/// - parameters: | |
/// - size: the first size used to calculate the ratio | |
/// - otherSize: the second size used to calculate the ratio | |
/// | |
/// - return: the aspect ratio between the two sizes | |
func aspectRatio(between size: CGSize, and otherSize: CGSize) -> CGFloat { | |
let aspectWidth = size.width/otherSize.width | |
let aspectHeight = size.height/otherSize.height | |
switch self { | |
case .aspectFill: | |
return max(aspectWidth, aspectHeight) | |
case .aspectFit: | |
return min(aspectWidth, aspectHeight) | |
} | |
} | |
} | |
/// Scales an image to fit within a bounds with a size governed by the passed size. Also keeps the aspect ratio. | |
/// | |
/// - parameter: | |
/// - newSize: the size of the bounds the image must fit within. | |
/// - scalingMode: the desired scaling mode | |
/// | |
/// - returns: a new scaled image. | |
func scaled(to newSize: CGSize, scalingMode: UIImage.ScalingMode = .aspectFill) -> UIImage { | |
let aspectRatio = scalingMode.aspectRatio(between: newSize, and: size) | |
/* Build the rectangle representing the area to be drawn */ | |
var scaledImageRect = CGRect.zero | |
scaledImageRect.size.width = size.width * aspectRatio | |
scaledImageRect.size.height = size.height * aspectRatio | |
scaledImageRect.origin.x = (newSize.width - size.width * aspectRatio) / 2.0 | |
scaledImageRect.origin.y = (newSize.height - size.height * aspectRatio) / 2.0 | |
/* Draw and retrieve the scaled image */ | |
UIGraphicsBeginImageContext(newSize) | |
draw(in: scaledImageRect) | |
let scaledImage = UIGraphicsGetImageFromCurrentImageContext() | |
UIGraphicsEndImageContext() | |
return scaledImage! | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment