Ich habe festgestellt, dass es schwierig ist, eine Antwort zu finden, die Sie sofort in Ihrem Swift 3- Projekt verwenden können. Das Hauptproblem anderer Antworten ist, dass sie den Alpha-Kanal des Bildes nicht berücksichtigen. Hier ist die Technik, die ich in meinen Projekten verwende.
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
}
}
Anwendungsbeispiel:
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)
}
}
Dieser Code ist eine Neufassung der Apple-Erweiterung mit zusätzlicher Unterstützung für Bilder mit und ohne Alphakanal.
Als weitere Lektüre empfehle ich, diesen Artikel auf verschiedene Techniken zur Größenänderung von Bildern zu überprüfen . Der derzeitige Ansatz bietet eine anständige Leistung, arbeitet mit APIs auf hoher Ebene und ist leicht zu verstehen. Ich empfehle, daran festzuhalten, es sei denn, Sie stellen fest, dass die Größenänderung von Bildern einen Engpass in Ihrer Leistung darstellt.