假设您有一个UIImageView与视图相等的宽度。重新绘制图像以适应的一种方法是使用核心图形。您需要计算所需的比例因子才能正确地重新绘制图像。您可以在此处找到一些很棒的示例:
还有一个好的教程和基准测试,以更好地理解事物:
http://nshipster.com/image-resizing/
我使用的代码示例(基本上是修改了 GitHub 方法以适应我的需求):
let image = UIImage(data: data!)
let oldWidth = image!.size.width
let scaleFactor = UIWindow().screen.bounds.width / oldWidth
let cgImage = image!.CGImage
let width = Double(CGImageGetWidth(cgImage)) * Double(scaleFactor)
let height = Double(CGImageGetHeight(cgImage)) * Double(scaleFactor)
let bitsPerComponent = CGImageGetBitsPerComponent(cgImage)
let bytesPerRow = CGImageGetBytesPerRow(cgImage)
let colorSpace = CGImageGetColorSpace(cgImage)
let bitmapInfo = CGImageGetBitmapInfo(cgImage)
let context = CGBitmapContextCreate(nil, Int(width), Int(height), bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo.rawValue)
CGContextSetInterpolationQuality(context, .High)
CGContextDrawImage(context, CGRect(origin: CGPointZero, size: CGSize(width: CGFloat(width), height: CGFloat(height))), cgImage)
let scaledImage = CGBitmapContextCreateImage(context).flatMap { return UIImage(CGImage: $0) }
imageView.image = scaledImage
当你使用NSLayoutConstraint
时,它变得太容易了。
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFit
view.addSubview(imageView)
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
imageView.widthAnchor.constraint(equalToConstant: 250).isActive = true
let heightLayout = imageView.heightAnchor.constraint(equalToConstant: 250)
heightLayout.isActive = true
imageView.image = UIImage(named: "SomeImage")
if let size = imageView.image?.size {
heightLayout.constant = size.height / size.width * 250 // 250 is imageView width
view.layoutIfNeeded()
}