如何设置navigationItem titleView的按钮?
Posted
技术标签:
【中文标题】如何设置navigationItem titleView的按钮?【英文标题】:How to set button for navigationItem titleView? 【发布时间】:2012-11-12 09:56:29 【问题描述】:我想以编程方式为 navigationItem.titleView 设置按钮。
我尝试了以下代码但没有成功;
UIBarButtonItem *navigationTitleButton = [[UIBarButtonItem alloc] initWithTitle:@"Custom" style:UIBarButtonItemStyleBordered target:self action:@selector(backToHOmePage)];
navigationTitleButton.image = [UIImage imageNamed:@"title.png"];
self.navigationItem.titleView = navigationTitleButton;
警告说:从 'UIBarButtonItem *__strong' 分配给 'UIView *' 的指针类型不兼容
【问题讨论】:
【参考方案1】:尝试使用此代码,看看它是否适合您
UIView * container = [[UIView alloc]initWithFrame:CGRectZero];
UIButton * button = [[UIButton alloc]initWithFrame:CGRectZero];
[button addTarget:self action:@selector(backToHOmePage) forControlEvents:UIControlEventTouchUpInside];
[button setImage:[UIImage imageNamed:@"clanak_default.png"] forState:UIControlStateNormal];
[button sizeToFit];
[container addSubview:button];
[button release];
[container sizeToFit];
self.navigationItem.titleView = container;
[container release];
【讨论】:
您的解决方案有效,谢谢!为什么如果UIButton是UIView的子类,那么一个UIButton就不能直接作为titleView使用? 它将与 UIButton、UILabel 等一起使用。您只需要 initWithFrame 一个可见大小的 UIView。请参阅下面的或 Evgenjy S 的答案。【参考方案2】:你不必创建BarItem,你需要创建UIView类对象;
弧
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
view.backgroundColor = [UIColor clearColor];
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = view.frame;
[view addSubview:button];
self.navigationItem.titleView = view;
或
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(0, 0, 40, 40);
self.navigationItem.titleView = button;
【讨论】:
【参考方案3】:Swift 版本:
var button = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
button.frame = CGRectMake(0, 0, 100, 40) as CGRect
button.backgroundColor = UIColor.redColor()
button.setTitle("Button", forState: UIControlState.Normal)
button.addTarget(self, action: Selector("clickOnButton:"), forControlEvents: UIControlEvents.TouchUpInside)
self.navigationItem.titleView = button
这里你可以看到最后一行按钮被直接设置为navigationItem的titleView,它将在导航栏的中心添加按钮。
按钮的动作方法如下:
func clickOnButton(button: UIButton)
【讨论】:
【参考方案4】:你可以直接添加一个 UIImageView 作为 navigationItem 的 titleView,但是如果你不确定它的大小,它是不可见的。最简单的调整大小的方法是使用 sizeToFit()。
在此示例中,我还圆角并添加了知道是否被点击的功能。
override func viewDidLoad()
super.viewDidLoad()
let titleIconButton = UIButton(type: .Custom)
titleIconButton.setImage(UIImage(named: "login-icon"), forState: .Normal)
titleIconButton.addTarget(self, action: #selector(titleIconTap), forControlEvents: .TouchUpInside)
titleIconButton.clipsToBounds = true
titleIconButton.layer.cornerRadius = 4
titleIconButton.sizeToFit()
navigationItem.titleView = titleIconButton
【讨论】:
【参考方案5】:这是 @Esqarrouth 答案的 Swift 4 移植版本。
let button = UIButton(type: .custom)
button.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
button.backgroundColor = .red
button.setTitle("Button", for: .normal)
button.addTarget(self, action: #selector(clickedButton(_:)), for: .touchUpInside)
self.navigationItem.titleView = button
【讨论】:
【参考方案6】:Swift 3 版本:
let logoButton = UIButton(type: .custom)
logoButton.setImage(#imageLiteral(resourceName: "Logo"), for: .normal)
logoButton.sizeToFit()
logoButton.addTarget(self, action: #selector(tapLogo), for: .touchUpInside)
self.navigationItem.title = ""
self.navigationItem.titleView = logoButton
【讨论】:
【参考方案7】:如果您计划在运行时更改 button.title,并且您将标题更改为更长的文本,它将不会居中。如果你做 button.sizeToFit(),它会居中,但显示新标题为“T..e”。
解决方案是将 UIButton 放在 UIView 中。并将按钮约束到 UIView 的所有侧面。 然后只需将 navigationItem.titleView 设置为该 UIView。并且它将完美地处理程序化的标题更改。
【讨论】:
【参考方案8】:尝试为您的按钮创建一个 UIButton 对象而不是 UIBarButtonItem 对象。 UIButton 是 UIView 的子类,因此您应该能够将 titleView 属性设置为您创建的 UIButton。
【讨论】:
【参考方案9】:您可以在视图上添加按钮,然后将该视图作为导航栏的标题视图,然后您可以在运行时轻松更改按钮的标题。
【讨论】:
【参考方案10】:这种基于 UISegmentedControl 的方法可能会对您有所帮助:https://***.com/a/16792575/171933 享受!
【讨论】:
以上是关于如何设置navigationItem titleView的按钮?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 UISearchController 搜索栏设置为不是 tableHeaderView 或 navigationItem.titleview 的视图?
调整 navigationItem.titleView 的框架?
iOS 11 navigationItem.titleView 宽度未设置