Swift UIKit中如何固定导航栏左侧Logo位置?
解决UIKit导航栏左侧放置Logo的问题
问题分析
你两次尝试存在的核心问题:
- 第一次使用
leftBarButtonItems时,未给Logo设置明确尺寸,系统自动调整按钮布局空间导致视觉上偏中间;且navigationController?.navigationBar.contentMode是无效设置,UINavigationBar不支持该属性。 - 第二次使用
titleView本身就是导航栏的标题位置,默认居中显示,不符合左侧放置需求。 - 第二次尝试代码存在拼写错误:
UTImage应为UIImage,alwaysOriginal需写成.alwaysOriginal,.scalespectFit应为.scaleAspectFit,这些错误会导致代码无法正常运行。
正确解决方案
通过自定义UIBarButtonItem的customView实现,给UIImageView设置明确宽高,确保Logo固定在导航栏左侧:
private func configureNavBar() { // 加载Logo图片并保留原始颜色 guard let logoImage = UIImage(named: "netflixLogo")?.withRenderingMode(.alwaysOriginal) else { return } // 创建UIImageView并设置尺寸和内容模式 let logoImageView = UIImageView(image: logoImage) logoImageView.contentMode = .scaleAspectFit // 根据Logo实际尺寸调整宽高,示例用40x30 logoImageView.frame = CGRect(x: 0, y: 0, width: 40, height: 30) // 将imageView作为customView创建左侧BarButtonItem let leftBarButton = UIBarButtonItem(customView: logoImageView) // 设置左侧按钮 navigationItem.leftBarButtonItem = leftBarButton // 设置右侧按钮 navigationItem.rightBarButtonItems = [ UIBarButtonItem(image: UIImage(systemName: "person"), style: .plain, target: self, action: nil), UIBarButtonItem(image: UIImage(systemName: "play.rectangle"), style: .plain, target: self, action: nil) ] // 导航栏样式设置 navigationController?.navigationBar.tintColor = .white // 隐藏默认标题,避免挤压左侧按钮空间 navigationItem.title = nil }
额外注意事项
- 根据Logo实际尺寸调整
logoImageView的frame,避免过大导致被导航栏裁剪。 - 若需给Logo添加点击事件,可给
logoImageView添加UITapGestureRecognizer:
然后实现对应的let tapGesture = UITapGestureRecognizer(target: self, action: #selector(logoTapped)) logoImageView.isUserInteractionEnabled = true logoImageView.addGestureRecognizer(tapGesture)@objc方法:@objc private func logoTapped() { // 处理Logo点击事件 } - 不要设置
navigationItem.title,否则系统会优先显示标题,挤压左侧按钮空间。
内容的提问来源于stack exchange,提问作者Mona742
相关产品推荐
相关产品推荐

