LeftBarButtonItem 有两个按钮。一键不响应点击

Posted

技术标签:

【中文标题】LeftBarButtonItem 有两个按钮。一键不响应点击【英文标题】:LeftBarButtonItem with two buttons. One Button doesnt respond to tap 【发布时间】:2011-12-02 19:32:07 【问题描述】:

所以我在 leftBarButtonItem 中有两个按钮。这是我的代码。

NSString *todayString = @"...";
UIBarButtonItem *todayButton = [[[UIBarButtonItem alloc] initWithTitle:todayString style:UIBarButtonItemStyleBordered target:self.calendarController action:@selector(todaySelected)] autorelease];

NSString *weeklyString = @"...";
UIBarButtonItem *weeklyButton = [[[UIBarButtonItem alloc] initWithTitle:weeklyString style:UIBarButtonItemStyleBordered target:self action:@selector(weekSelected)] autorelease];
UIToolbar *toolbar = [[[UIToolbar alloc] init] autorelease];

[toolbar setItems:[NSArray arrayWithObjects:todayButton, weeklyButton, nil]];

self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:toolbar] autorelease];

按钮的标题是动态的。有时标题可能会有点长。按钮展开并且看起来不错。但是,如果标题过长,UIToolbar 似乎会达到某个最大宽度,因为按钮在某个 X 点停止响应点击。 See image here

绿色表示响应触摸,红色表示不响应触摸。今天按钮响应触摸。然而,每周按钮仅在第二个“e”之前响应触摸。之后的任何内容都不会响应触摸。

一段时间以来,我一直在努力解决这个问题,但没有运气。我尝试扩展 UIToolbar 和 leftBarButtonItem 的框架。有谁知道发生了什么?提前致谢

【问题讨论】:

为什么要将 UIToolbar 视图分配给 UIBarButtonItem? 据我了解,这是向左/右BarButtonItem 添加多个按钮的标准方式。我在关注这个例子:mattdipasquale.com/blog/2010/11/02/… 您要做的是创建一个自定义按钮视图,例如使用 UIButton,然后将其分配给您的 BarButtonItem 的自定义视图。您像对待任何其他按钮一样对待自定义视图,它应该可以工作。请参阅下面的答案。 我现在已经理解了这个问题并编辑了我的答案,抱歉。与其他答案类似,所以我不知道它是否有帮助...... 【参考方案1】:

您的工具栏框架宽度可能太窄。在您的代码中,您甚至没有设置它的大小,而是依靠它来为您调整大小。尝试将其设置为更大的宽度,并确保 autoresizingMask 没有设置“UIViewAutoresizingFlexibleWidth”。

一种好的调试技术是将新工具栏的背景颜色设置为明亮的颜色(与您安装它的工具栏形成对比),并观察其大小以了解按钮在交互方面是如何被剪裁的。

如果将其固定到某个宽度对您的应用来说过于严格,您可能需要在更新栏按钮项目标题时显式调整其大小。

【讨论】:

您好,感谢您的回复。我已经尝试过设置工具栏的大小并增加宽度,但没有成功。另外,我尝试了您更改背景颜色的建议,但不幸的是,这并没有做任何事情。我看不到颜色变化:/ 对不起,tintColor 可能更合适。 tintColor 也不行:\ 原来你是对的,工具栏不够宽,这是我最初怀疑的。当我尝试设置宽度时,什么也没发生。这是因为稍后在代码中将宽度重置为更小的值(我不知道这一点)。感谢您的帮助 我很高兴你知道了。干杯!【参考方案2】:

您需要创建一个可操作的自定义按钮视图,例如 UIButton:

UIButton *newButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [newButton addTarget:self action:@selector(newAction:) forControlEvents:UIControlEventTouchUpInside];
    [newButton setTitle:@"New Button" forState:UIControlStateNormal];
    UIBarButtonItem *newBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:newButton];
    self.navigationItem.leftBarButtonItem = newBarButtonItem;

例如。

编辑 - 现在我明白了你在做什么,我为之前的困惑道歉。您正在向左侧添加一组按钮。尝试调整工具栏的框架,使按钮适合交互区域:

NSString *todayString = @"...";
        UIBarButtonItem *todayButton = [[UIBarButtonItem alloc] initWithTitle:todayString style:UIBarButtonItemStyleBordered target:self action:nil];

        NSString *weeklyString = @"...";
        UIBarButtonItem *weeklyButton = [[UIBarButtonItem alloc] initWithTitle:weeklyString style:UIBarButtonItemStyleBordered target:self action:nil];
        UIToolbar *toolbar = [[UIToolbar alloc] init];
        [toolbar setFrame:CGRectMake(0, 0, 320, 50)];

        [toolbar setItems:[NSArray arrayWithObjects:todayButton, weeklyButton, nil]];

        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:toolbar];

【讨论】:

【参考方案3】:

我知道这是一个老问题,但它让我误入歧途,直到我找到更新的信息。我无法在 ios 7 中使用上述技术,因为嵌入式工具栏不会与其父工具栏对齐。 无论如何,iOS 5(我相信)为左右项目添加了按钮数组:

UIBarButtonItem * trashItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(onTrashClick:)];
UIBarButtonItem * mailItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(onActionClick:)];
self.navigationItem.rightBarButtonItems = [[NSArray alloc] initWithObjects: refreshBtn, selectYearBtn, nil];

【讨论】:

以上是关于LeftBarButtonItem 有两个按钮。一键不响应点击的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 UINavigation leftBarButtonItem 的颜色

Objective c - UIActivityViewController 和 navigationItem.leftBarButtonItem 的组合

将 leftBarButtonItem 添加到导航栏的问题

引用 UINavigationBar 上的后退按钮

如何设置leftBarButtonItem左对齐

如何设置大小 leftBarButtonItem?