首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以在UIImageView中结合使用方面填充内容模式和顶级内容模式?

是否可以在UIImageView中结合使用方面填充内容模式和顶级内容模式?
EN

Stack Overflow用户
提问于 2017-12-19 10:08:25
回答 4查看 9.5K关注 0票数 17

对于UIImageView,我使用方面填充内容模式。没关系,但对于一些图片,它将从顶部剪裁,因为我使用了clipsToBounds = true。下面是我想要的:我想同时激活两个过滤器,例如:

下面是我设置为方面填充的图像视图:

...and我使用contentMode = .top设置的图像视图

所以我想合并这两种内容模式。有可能吗?提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-12-19 10:32:38

更新:设备缩放现在得到了正确的处理,这要感谢budidino

您应该调整图像的大小,使其具有图像视图的宽度,但要保持其高宽比。然后,将图像视图的内容模式设置为.top,并为其启用限幅。

resizeTopAlignedToFill函数是this answer的一个修改版本。

代码语言:javascript
运行
复制
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
    }
}
票数 21
EN

Stack Overflow用户

发布于 2017-12-19 11:56:30

试试这个:

代码语言:javascript
运行
复制
imageView.contentMode = UIViewContentModeTop;
imageView.image = [UIImage imageWithCGImage:image.CGImage scale:image.size.width / imageView.frame.size.width orientation:UIImageOrientationUp];
票数 5
EN

Stack Overflow用户

发布于 2019-01-23 15:56:24

公认的答案是缩小图像,从而降低@2x和@3x设备的质量。这将产生同样的结果,更好的图像质量:

代码语言:javascript
运行
复制
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
  }
}

然后使用它:

代码语言:javascript
运行
复制
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
imageView.image = UIImage(named: "portrait").resizeTopAlignedToFill(containerSize: imageView.frame.size)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47884519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档