Saya telah menemukan bahwa sulit untuk menemukan jawaban yang dapat Anda gunakan di luar kotak di proyek Swift 3 Anda . Masalah utama dari jawaban lain bahwa mereka tidak menghormati saluran alpha gambar. Berikut adalah teknik yang saya gunakan dalam proyek saya.
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
}
}
Contoh penggunaan:
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)
}
}
Kode ini adalah penulisan ulang ekstensi Apple dengan dukungan tambahan untuk gambar dengan dan tanpa saluran alpha.
Sebagai bacaan lebih lanjut saya sarankan memeriksa artikel ini untuk berbagai teknik mengubah ukuran gambar. Pendekatan saat ini menawarkan kinerja yang layak, ia mengoperasikan API tingkat tinggi dan mudah dimengerti. Saya sarankan tetap melakukannya kecuali jika Anda menemukan bahwa mengubah ukuran gambar adalah hambatan dalam kinerja Anda.