6

我想以编程方式为 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 *' 的指针类型不兼容

4

10 回答 10

14

尝试使用此代码,看看它是否适合您

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];
于 2012-11-12T10:02:33.613 回答
10

您不必创建 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;
于 2012-11-12T10:01:24.707 回答
2

斯威夫特版本:

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) {

}
于 2015-09-13T15:56:21.780 回答
2

您可以直接将 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
}

在此处输入图像描述

于 2016-05-12T22:14:28.423 回答
2

这是@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
于 2018-10-18T05:52:05.013 回答
1

斯威夫特 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
于 2017-06-16T13:03:15.023 回答
1

如果您计划在运行时更改 button.title,并且将标题更改为更长的文本,它将不会居中。如果您执行 button.sizeToFit(),它将居中,但将新标题显示为“T..e”。

解决方案是将 UIButton 放在 UIView 中。并将按钮约束到 UIView 的所有侧面。然后只需将 navigationItem.titleView 设置为该 UIView。它将完美地处理程序化的标题更改。

于 2017-12-15T05:33:30.060 回答
0

尝试为您的按钮创建一个 UIButton 对象,而不是 UIBarButtonItem 一个。UIButton 是 UIView 的子类,因此您应该能够将 titleView 属性设置为您创建的 UIButton。

于 2012-11-12T10:00:49.747 回答
0

您可以在视图上添加按钮,然后将该视图作为导航栏的标题视图,然后您可以在运行时轻松更改按钮的标题。

于 2012-11-12T10:01:46.313 回答
0

这种基于 UISegmentedControl 的方法可能会对您有所帮助:https ://stackoverflow.com/a/16792575/171933享受吧!

于 2013-05-28T12:53:49.720 回答