添加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
相关产品推荐
相关产品推荐

