You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加UIImage后UIImageView框架被忽略且尺寸异常调整的问题

解决导航栏TitleView图片尺寸不符合预期的问题

嘿,我之前也踩过这个坑!导航栏的titleView并不会完全遵守你手动设置的frame——因为UINavigationBar内部是用Auto Layout来管理子视图布局的,默认的UIImageView会根据自身的intrinsicContentSize(也就是图片的原始尺寸)来调整大小,导致你设置的宽高被覆盖。

给你两个亲测有效的解决办法:

方法一:自定义ImageView重写intrinsicContentSize

我们可以创建一个自定义的UIImageView子类,让它返回我们想要的尺寸作为固有内容尺寸,这样Auto Layout就会尊重我们的设置:

class FixedSizeImageView: UIImageView {
    // 用来存储我们想要的尺寸
    var preferredSize: CGSize = .zero
    
    override var intrinsicContentSize: CGSize {
        return preferredSize != .zero ? preferredSize : super.intrinsicContentSize
    }
}

使用的时候这样写:

override func viewDidLoad() {
    super.viewDidLoad()
    
    let logo = UIImage(named: "Menu_Logo")
    let imageView = FixedSizeImageView()
    imageView.preferredSize = CGSize(width: 122, height: 26)
    imageView.contentMode = .scaleAspectFit
    imageView.clipsToBounds = true
    imageView.image = logo
    
    self.navigationItem.titleView = imageView
}

方法二:直接添加Auto Layout约束

既然导航栏用的是Auto Layout,那我们直接给ImageView添加强制的宽高约束就好了,比设置frame更可靠:

override func viewDidLoad() {
    super.viewDidLoad()
    
    let logo = UIImage(named: "Menu_Logo")
    let imageView = UIImageView(image: logo)
    imageView.contentMode = .scaleAspectFit
    imageView.clipsToBounds = true
    // 一定要关掉自动转换约束,否则添加的自定义约束会冲突
    imageView.translatesAutoresizingMaskIntoConstraints = false
    
    self.navigationItem.titleView = imageView
    
    // 激活约束
    NSLayoutConstraint.activate([
        imageView.widthAnchor.constraint(equalToConstant: 122),
        imageView.heightAnchor.constraint(equalToConstant: 26)
    ])
}

这两种方法都能让你的导航栏图片显示成你想要的122x26尺寸,我个人更推荐第二种,不用额外写子类,代码更简洁~

内容的提问来源于stack exchange,提问作者tomsqrd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:27:09