Swift:UIButton在BarButtonItem中图片变形的解决办法求助
我之前也碰到过一模一样的情况!导航栏的bar button item对自定义视图的尺寸约束经常有点“不听话”,除了设置contentMode = .scaleAspectFit,这几个办法亲测有效:
用Auto Layout约束代替frame设置尺寸
直接设置frame在导航栏环境下很容易被系统覆盖,改用Auto Layout强制锁定按钮的宽高,能确保尺寸稳定:let userProfilePic = UIButton(type: .custom) userProfilePic.setImage(UIImage(named: "profile_icon.jpg"), for: .normal) userProfilePic.contentMode = .scaleAspectFit // 添加明确的宽高约束 userProfilePic.widthAnchor.constraint(equalToConstant: 24).isActive = true userProfilePic.heightAnchor.constraint(equalToConstant: 24).isActive = true navigationItem.leftBarButtonItem = UIBarButtonItem(customView: userProfilePic)提前将图片缩放到目标尺寸
把原图预先处理成24x24的大小再赋值给按钮,从根源上避免按钮的缩放逻辑导致变形:func resizeImage(to targetSize: CGSize, from originalImage: UIImage) -> UIImage? { let renderer = UIGraphicsImageRenderer(size: targetSize) return renderer.image { context in originalImage.draw(in: CGRect(origin: .zero, size: targetSize)) } } // 使用示例 if let originalImage = UIImage(named: "profile_icon.jpg"), let resizedImage = resizeImage(to: CGSize(width: 24, height: 24), from: originalImage) { let userProfilePic = UIButton(frame: CGRect(x: 0, y: 0, width: 24, height: 24)) userProfilePic.setImage(resizedImage, for: .normal) navigationItem.leftBarButtonItem = UIBarButtonItem(customView: userProfilePic) }调整按钮的imageEdgeInsets
有时候图片变形是因为按钮的内边距默认值不合适,通过调整内边距把图片限制在按钮的有效显示区域内:let userProfilePic = UIButton(frame: CGRect(x: 0, y: 0, width: 24, height: 24)) userProfilePic.setImage(UIImage(named: "profile_icon.jpg"), for: .normal) userProfilePic.contentMode = .scaleAspectFit // 根据图片实际比例调整内边距,这里是示例值,你可以按需微调 userProfilePic.imageEdgeInsets = UIEdgeInsets(top: 2, left: 2, bottom: 2, right: 2) navigationItem.leftBarButtonItem = UIBarButtonItem(customView: userProfilePic)改用UIImageView+手势模拟按钮
如果UIButton的内部布局逻辑实在不好控制,直接用UIImageView展示图片,再添加手势识别实现点击功能,这种方式更灵活:let profileImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 24, height: 24)) profileImageView.image = UIImage(named: "profile_icon.jpg") profileImageView.contentMode = .scaleAspectFit profileImageView.isUserInteractionEnabled = true // 添加点击手势 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleProfileTap)) profileImageView.addGestureRecognizer(tapGesture) navigationItem.leftBarButtonItem = UIBarButtonItem(customView: profileImageView) // 点击回调方法 @objc func handleProfileTap() { // 这里写你的点击逻辑 }
内容的提问来源于stack exchange,提问作者N. Beer
相关产品推荐
相关产品推荐

