Tôi đã phát hiện ra rằng thật khó để tìm ra câu trả lời mà bạn có thể sử dụng ngoài hộp trong dự án Swift 3 của mình . Vấn đề chính của các câu trả lời khác là họ không tôn trọng kênh alpha của hình ảnh. Đây là kỹ thuật mà tôi đang sử dụng trong các dự án của mình.
extension UIImage {
func scaledToFit(toSize newSize: CGSize) -> UIImage {
if (size.width < newSize.width && size.height < newSize.height) {
return copy() as! UIImage
}
let widthScale = newSize.width / size.width
let heightScale = newSize.height / size.height
let scaleFactor = widthScale < heightScale ? widthScale : heightScale
let scaledSize = CGSize(width: size.width * scaleFactor, height: size.height * scaleFactor)
return self.scaled(toSize: scaledSize, in: CGRect(x: 0.0, y: 0.0, width: scaledSize.width, height: scaledSize.height))
}
func scaled(toSize newSize: CGSize, in rect: CGRect) -> UIImage {
if UIScreen.main.scale == 2.0 {
UIGraphicsBeginImageContextWithOptions(newSize, !hasAlphaChannel, 2.0)
}
else {
UIGraphicsBeginImageContext(newSize)
}
draw(in: rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage ?? UIImage()
}
var hasAlphaChannel: Bool {
guard let alpha = cgImage?.alphaInfo else {
return false
}
return alpha == CGImageAlphaInfo.first ||
alpha == CGImageAlphaInfo.last ||
alpha == CGImageAlphaInfo.premultipliedFirst ||
alpha == CGImageAlphaInfo.premultipliedLast
}
}
Ví dụ về cách sử dụng:
override func viewDidLoad() {
super.viewDidLoad()
let size = CGSize(width: 14.0, height: 14.0)
if let image = UIImage(named: "barbell")?.scaledToFit(toSize: size) {
let imageView = UIImageView(image: image)
imageView.center = CGPoint(x: 100, y: 100)
view.addSubview(imageView)
}
}
Mã này là một bản viết lại của tiện ích mở rộng của Apple có thêm hỗ trợ cho hình ảnh có và không có kênh alpha.
Để đọc thêm, tôi khuyên bạn nên kiểm tra bài viết này để biết các kỹ thuật thay đổi kích thước hình ảnh khác nhau. Cách tiếp cận hiện tại cung cấp hiệu suất tốt, nó vận hành API cấp cao và dễ hiểu. Tôi khuyên bạn nên giữ nó trừ khi bạn thấy rằng thay đổi kích thước hình ảnh là một nút cổ chai trong hiệu suất của bạn.