【问题标题】:UIBarButtonItem Custom view in UINavigationBarUIBarButtonItem UINavigationBar 中的自定义视图
【发布时间】:2013-04-17 10:23:25
【问题描述】:

我正在为 uinavigationbar 制作自定义栏按钮,我正在使用以下代码

 UIImageView *backImgView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"chk_back.png"]]; [backImgView setUserInteractionEnabled:YES];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:backImgView];
[backButton setTarget:self];
[backButton setAction:@selector(BackBtn)];
checkIn_NavBar.topItem.leftBarButtonItem = backButton;

问题是它没有调用它的动作。我做错了什么?

【问题讨论】:

  • 我可以看看你的 BackBtn 方法吗?
  • 什么是 checkIn_NavBar?你有强烈的参考吗?为什么不使用 self.navigationItem.leftBarButtonItem?
  • 尝试使用 [checkIn_NavBar setLeftBarButtonItem:backButton];或 self.navigationItem.leftBarButtonItem=backButton;
  • checkIn_NavBar 有一个强引用并且没有调用 BackBtn 方法。

标签: ios objective-c uinavigationbar uibarbuttonitem


【解决方案1】:

来自 Apple 文档:
使用指定的自定义视图初始化新项目。

- (id)initWithCustomView:(UIView *)customView

参数 自定义视图 表示项目的自定义视图。 返回值 具有指定属性的新初始化项。

讨论: 此方法创建的条形按钮项不会调用其目标的操作方法来响应用户交互。相反,条形按钮项需要指定的自定义视图来处理任何用户交互并提供适当的响应。

解决方案:“使用您的背景图像创建按钮(为此按钮设置操作)并使用此按钮初始化栏按钮”。例如:

UIButton *btn =  [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(0,0,25,25)
[btn setBackgroundImage:[UIImage imageNamed:@"chk_back.png"] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(BackBtn) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *barBtn = [[UIBarButtonItem alloc] initWithCustomView:btn];

【讨论】:

  • 很好的答案,但是:文档说:“创建自定义按钮时——即 UIButtonTypeCustom 类型的按钮——按钮的框架设置为 (0, 0, 0, 0)最初。在将按钮添加到界面之前,您应该将框架更新为更合适的值。”所以你应该明确设置按钮的框架,否则你什么也看不到!b v
  • @ReinhardMänner - 你救了我的命,伙计!此外,这对于框架来说是一个糟糕的默认值......
  • @katzenhut - 很高兴我能帮助你,你对默认值是完全正确的......
  • 我添加了框架的规格,并将其设为 75x44,类似于默认的 UIBarButtonItem。将图像设为 25x25 的可视区域,并被透明度包围。
【解决方案2】:

我使用以下代码完成了这项工作:

UIButton *nxtBtn =  [UIButton buttonWithType:UIButtonTypeCustom];
[nxtBtn setImage:[UIImage imageNamed:@"chk_next.png"] forState:UIControlStateNormal];
[nxtBtn addTarget:self action:@selector(NextBtn) forControlEvents:UIControlEventTouchUpInside];
[nxtBtn setFrame:CGRectMake(0, 0, 64, 31)];
UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithCustomView:nxtBtn];

checkIn_NavBar.topItem.rightBarButtonItem=nextButton;

【讨论】:

  • 因此您将按钮添加到按钮上。这听起来根本不对。
  • @Popeye UIBarButtonItem 不是按钮,看看它是继承。
  • @BryanBryce 该死的,这太老了,我想我更多的是说UIBarButtonItem 本身是一种按钮形式,不一定说它是从UIButton 继承的——谢谢你测试我的记忆力.#
猜你喜欢
  • 1970-01-01
  • 2016-08-27
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多