导航栏左侧按钮出现问题

3
我在导航栏左侧有一个按钮。附近还有一个UIButton按钮。

现在,当我点击导航栏下方的按钮时,在许多情况下,导航栏上的按钮也会被点击。

这是为什么?有任何建议吗?

谢谢。

图片:如果您在红色按钮内部的任何位置单击,则仍会按下导航栏左上角的按钮。

enter image description here

导航栏按钮代码:

UIButton *leftButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 25, 25)];
[leftButton setShowsTouchWhenHighlighted:NO];
[leftButton setImage:[UIImage imageNamed:@"deals.png"] forState:UIControlStateNormal];
[leftButton setImage:[UIImage imageNamed:@"deals_down.png"] forState:UIControlStateSelected];
[leftButton setImage:[UIImage imageNamed:@"deals_down.png"] forState:UIControlStateHighlighted];
[leftButton addTarget:self action:@selector(dealsButtonPressed:) forControlEvents:UIControlEventTouchDown || UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem =  [[[UIBarButtonItem alloc] initWithCustomView:leftButton] autorelease];
[leftButton release];

1
请问您能否为这个场景发布一张图片吗? - Mrunal
2
最好的猜测是,您实际上是意外点击了导航栏上的按钮。 - Peter Sarnowski
@PeterSarnowski:现在给出图形。谢谢。 - Ahsan
@mrunal:现在给出图形。谢谢。 - Ahsan
1
你如何在导航栏中设置按钮?请展示给我们代码。 - sosborn
我同意fbernardo的答案。我的问题是,为什么你想把按钮放得这么靠近呢?我认为这是不好的设计,而且信不信由你,在软件开发/设计中非常重要。例如,在电子邮件客户端中,您是否希望删除和回复按钮非常靠近?我不这么认为。这里有一篇关于这个主题的优秀文章:http://www.amazon.com/exec/obidos/ASIN/0465067107/codihorr-20 - C0D3
3个回答

12

UINavigationButtons的可点击区域比其视图要大得多,苹果出于易用性考虑而这样做。如果您真的想要两个按钮彼此靠近,那么您需要子类化UINavigationBar,更具体地说,重写触摸事件,获取触摸坐标并根据需要进行操作。更多信息请看这里


"苹果这样做是为了方便使用。最好遵循苹果的规定,将自己的按钮降低,否则如果你把自己的按钮放得太靠近导航栏的按钮,就会让人们误按错按钮。" - Danra

2
请注意,如果苹果放大了navigationBar的左按钮(右按钮没有),那是出于可用性问题。这几乎是iPhone设备上被点击最多的按钮,因此人们已经具备了本能地轻敲返回按钮的能力(我从不看按钮,我只知道动作)。
请记住,如果您缩小触摸区域,用户可能会难以到达它。
我的建议是,把您的3个按钮向下移动3或5像素。

唉,对于技术问题的回答(它们值得),有那么多赞,而对于像你这样与可用性相关的回答却很少。 - Danra

1

看起来你初始化UIButton实例的方式有问题。在这种情况下,通常我们会使用[UIButton buttonWithType:custom];

这个答案中,他们用以下方法解决了一个类似的问题:

UIImage *myImage = [UIImage imageNamed:@"paw.png"];
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setImage:myImage forState:UIControlStateNormal];
myButton.showsTouchWhenHighlighted = YES;
myButton.frame = CGRectMake(0.0, 0.0, myImage.size.width, myImage.size.height);

[myButton addTarget:self action:@selector(tapped:) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithCustomView:myButton];
self.navigationItem.rightBarButtonItem = rightButton;

[rightButton release];
[myButton release];

这不是你要找的代码,但它展示了如何正确实例化一个UIButton实例。希望这能解决你遇到的问题。


所以,换句话说,我需要将类型设置为“自定义”并单独设置框架。这是你的意思吗? - Ahsan
这正是我所暗示的 - 按钮应该只使用 buttonWithType: 实例化。很抱歉听到那不是你的问题 - 祝你好运! - Ash Furrow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接