如何通过代码将UIBarButtonItem图片移至左侧作为菜单按钮
嗨,这个问题我太熟悉啦!要把UIBarButtonItem的图片从导航栏中央移到左侧当菜单按钮,其实iOS的导航栏框架本身就提供了现成的位置属性,分几种场景给你讲明白:
1. 基础实现:直接用图片创建左侧菜单按钮
如果只是需要一张图片作为左侧菜单按钮,最简单的方式就是创建UIBarButtonItem时指定图片,然后把它赋值给当前ViewController的navigationItem.leftBarButtonItem——这个属性就是专门用来设置导航栏左侧按钮的,完全不会跑到中央去。
Swift 代码示例:
// 加载图片(如果是Assets里的资源,直接传名字就行) // 加上withRenderingMode是为了保持图片原本的颜色,避免被导航栏的tintColor覆盖 let menuImage = UIImage(named: "menu_icon")?.withRenderingMode(.alwaysOriginal) // 创建按钮,绑定点击事件 let menuBarButton = UIBarButtonItem(image: menuImage, style: .plain, target: self, action: #selector(menuButtonTapped)) // 关键一步:把按钮赋值给左侧位置 navigationItem.leftBarButtonItem = menuBarButton // 按钮点击的处理逻辑 @objc func menuButtonTapped() { // 这里写你的菜单弹出逻辑,比如侧滑菜单展开 print("菜单按钮被点击啦!") }
Objective-C 代码示例:
// 加载图片并设置渲染模式,避免颜色被覆盖 UIImage *menuImage = [[UIImage imageNamed:@"menu_icon"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; // 创建按钮并绑定事件 UIBarButtonItem *menuBarButton = [[UIBarButtonItem alloc] initWithImage:menuImage style:UIBarButtonItemStylePlain target:self action:@selector(menuButtonTapped)]; // 赋值给左侧按钮位置 self.navigationItem.leftBarButtonItem = menuBarButton; // 点击事件处理 - (void)menuButtonTapped { NSLog(@"菜单按钮被点击啦!"); }
2. 自定义按钮(调整图片位置/添加额外样式)
如果默认的图片位置太靠边或者太挤,你可以先自定义一个UIButton,调整好样式和内边距后,再把它包装成UIBarButtonItem:
Swift 代码示例:
let customMenuButton = UIButton(type: .system) // 设置图片 customMenuButton.setImage(UIImage(named: "menu_icon")?.withRenderingMode(.alwaysOriginal), for: .normal) // 设置按钮大小 customMenuButton.frame = CGRect(x: 0, y: 0, width: 30, height: 30) // 绑定点击事件 customMenuButton.addTarget(self, action: #selector(menuButtonTapped), for: .touchUpInside) // 调整图片内边距,避免贴在屏幕左边缘 customMenuButton.imageEdgeInsets = UIEdgeInsets(top: 0, left: -10, bottom: 0, right: 10) // 把自定义按钮包装成UIBarButtonItem let menuBarButton = UIBarButtonItem(customView: customMenuButton) navigationItem.leftBarButtonItem = menuBarButton
3. 几个关键注意事项
- 一定要给图片设置
withRenderingMode(.alwaysOriginal),不然导航栏的全局tintColor会把你的图片颜色覆盖,变成和导航栏一样的色调,菜单图标可能就不显眼了。 - 你的ViewController必须是嵌入在
UINavigationController里面的,才能直接使用navigationItem属性;如果没有导航控制器,记得先给ViewController套一个UINavigationController。 - 如果需要左侧放多个按钮,可以用
navigationItem.leftBarButtonItems(复数形式)传入一个UIBarButtonItem数组,按钮会从左到右依次排列。
内容的提问来源于stack exchange,提问作者Aditya Naik
相关产品推荐
相关产品推荐

