Swift 3 프로젝트 에서 즉시 사용할 수있는 답변을 찾기가 어렵다는 것을 발견했습니다 . 다른 답변의 주요 문제는 이미지의 알파 채널을 존중하지 않는다는 것입니다. 다음은 프로젝트에서 사용중인 기술입니다.
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
}
}
사용 예 :
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)
}
}
이 코드는 알파 채널 유무에 관계없이 이미지에 대한 지원이 추가 된 Apple 확장의 재 작성입니다 .
추가로 읽을 때 다른 이미지 크기 조정 기술에 대해이 기사 를 확인 하는 것이 좋습니다 . 현재 접근 방식은 적절한 성능을 제공하고 높은 수준의 API를 운영하며 이해하기 쉽습니다. 이미지 크기 조정이 성능에 병목 현상이 발생하지 않는 한이를 고수하는 것이 좋습니다.