对于UIImageView
,我使用方面填充内容模式。没关系,但对于一些图片,它将从顶部剪裁,因为我使用了clipsToBounds = true
。下面是我想要的:我想同时激活两个过滤器,例如:
下面是我设置为方面填充的图像视图:
...and我使用contentMode = .top
设置的图像视图
所以我想合并这两种内容模式。有可能吗?提前谢谢。
发布于 2017-12-19 10:32:38
更新:设备缩放现在得到了正确的处理,这要感谢budidino!
您应该调整图像的大小,使其具有图像视图的宽度,但要保持其高宽比。然后,将图像视图的内容模式设置为.top
,并为其启用限幅。
resizeTopAlignedToFill
函数是this answer的一个修改版本。
func setImageView() {
imageView.contentMode = .top
imageView.clipsToBounds = true
let image = <custom image>
imageView.image = image.resizeTopAlignedToFill(newWidth: imageView.frame.width)
}
extension UIImage {
func resizeTopAlignedToFill(newWidth: CGFloat) -> UIImage? {
let newHeight = size.height * newWidth / size.width
let newSize = CGSize(width: newWidth, height: newHeight)
UIGraphicsBeginImageContextWithOptions(newSize, false, UIScreen.main.scale)
draw(in: CGRect(origin: .zero, size: newSize))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
}
发布于 2017-12-19 11:56:30
试试这个:
imageView.contentMode = UIViewContentModeTop;
imageView.image = [UIImage imageWithCGImage:image.CGImage scale:image.size.width / imageView.frame.size.width orientation:UIImageOrientationUp];
发布于 2019-01-23 15:56:24
公认的答案是缩小图像,从而降低@2x和@3x设备的质量。这将产生同样的结果,更好的图像质量:
extension UIImage {
func resizeTopAlignedToFill(containerSize: CGSize) -> UIImage? {
let scaleTarget = containerSize.height / containerSize.width
let scaleOriginal = size.height / size.width
if scaleOriginal <= scaleTarget { return self }
let newHeight = size.width * scaleTarget
let newSize = CGSize(width: size.width, height: newHeight)
UIGraphicsBeginImageContextWithOptions(newSize, false, scale)
self.draw(in: CGRect(origin: .zero, size: newSize))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
}
然后使用它:
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
imageView.image = UIImage(named: "portrait").resizeTopAlignedToFill(containerSize: imageView.frame.size)
https://stackoverflow.com/questions/47884519
复制相似问题