我知道有些人已经提出了这个问题,但到目前为止,答案并不是特定的。
显然苹果已经使NavigationBar的点击区域比实际大,但我不认为它应该那么大。
在我的应用程序中,NavBar下方有一个TableView,你可以一直点击第一个单元格的一半来触发rightBarButtonItem的事件。 按钮的实例如下:
UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editTable)];
[[self navigationItem] setRightBarButtonItem:editButton];
“self”是NavigationController的根ViewController。
你可以想象,这是一个问题,因为单元格可以选择推送另一个ViewController。
我设法通过使细胞的高度更大来解决问题,但我宁愿将它们放在常规尺寸上。
我确信我不是唯一一个有这种情况的人。 提前谢谢。
答案 0 :(得分:8)
UIButton *menuButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
[menuButton addTarget:self action:@selector(revealMenu:) forControlEvents:UIControlEventTouchUpInside];
[menuButton setImage:[UIImage imageNamed:@"menuIcon"] forState:UIControlStateNormal];
UIView *menuButtonContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
[menuButtonContainer addSubview:menuButton];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:menuButtonContainer];
这对我来说非常有用......
答案 1 :(得分:0)
你对触控区域做不了多少。这一切都取决于显示器拾取的手指区域。您可以计算size of touch area(警告:未记录的api),但拦截触摸事件并调用方法来纠正肥胖手指综合症似乎有点过头了。
基本流程是:
答案 2 :(得分:0)
iosDeveloper中关于在按钮周围放置容器视图的另一个答案可以帮助缩小按钮左侧和右侧可点击区域的大小,但是对于我遇到的问题没有任何帮助激活点击导航栏下方的按钮。
经过几个小时搜索几个不同的SO线程并尝试各种各样的事情,我终于在这里找到了我对这个问题的答案:https://stackoverflow.com/a/10597699/1289240
答案 3 :(得分:0)
由于我使用透明工具栏并为UIBarButtonItem着色,我无法使用自定义视图,因为我需要设置色调,宽度/高度,圆角以使其类似于UIBarButtonItem外观
因此我使用了一个隐藏按钮,我将其添加到我的项目中以解决此问题。和事件被困在那里
@interface UIBarButtonItem(ImageButton)中的
+ (UIBarButtonItem*) invisibleButtonForTransparentBar {
static UIBarButtonItem* fakeBtn = nil;
if (!fakeBtn) {
fakeBtn = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc] init]];
}
return fakeBtn;
}
View Controller中的:
[self.viewToolbar setItems: @[flexSpace,
[UIBarButtonItem fakeLastButtonForTransparentBar],
self.btnTrackUser,
self.btnMapConfig,
[UIBarButtonItem fakeLastButtonForTransparentBar],
flexSpace] ];
答案 4 :(得分:0)
我们无法减少默认的uibarbuttonitem大小。这个想法是制作一个uibutton,添加到uiview,然后是uibarbuttonitem的自定义视图。 包含uibutton的uiview的大小将是uibarbutton的点击区域。
这是我的代码:
self.navigationController?.navigationBarHidden = false
let navigationBar = UINavigationBar(frame: CGRectMake(0, 0, self.view.frame.size.width, 64)) // Offset by 20 pixels vertically to take the status bar into account
navigationBar.backgroundColor = UIColor.blueColor()
navigationBar.delegate = self;
// Create a navigation item with a title
let navigationItem = UINavigationItem()
//menu button
let menubutton: UIButton = UIButton(frame: CGRectMake(0, 0, 30, 30))
menubutton.setImage(UIImage(named: "menu"), forState: UIControlState.Normal)
menubutton.addTarget(self, action: "btn_clicked", forControlEvents: UIControlEvents.TouchUpInside)
//menu button custom view
let leftView = UIView(frame: CGRectMake(0,0,30,30))
leftView.addSubview(menubutton)
//left uibarbutton
let leftItem:UIBarButtonItem = UIBarButtonItem(customView: leftView)
navigationItem.leftBarButtonItem = leftItem
//searchButton
let searchbutton: UIButton = UIButton()
searchbutton.setImage(UIImage(named: "search1x"), forState: UIControlState.Normal)
searchbutton.frame = CGRectMake(0, 0, 30, 30)
searchbutton.addTarget(self, action: "btn_clicked", forControlEvents: UIControlEvents.TouchUpInside)
//menu button custom view
let rightView = UIView(frame: CGRectMake(0,0,30,30))
rightView.addSubview(searchbutton)
//right uibarbutton
let rightItem:UIBarButtonItem = UIBarButtonItem(customView: rightView)
navigationItem.rightBarButtonItem = rightItem
// Assign the navigation item to the navigation bar
navigationBar.items = [navigationItem]
// Make the navigation bar a subview of the current view controller
self.view.addSubview(navigationBar)
注意:强> 例如: - 菜单按钮是一个UIButton并添加到leftView。 leftItem是一个UIBarButtonItem,并被添加到navigationBar的leftBarButtonItem中。 leftView被添加为leftItem的自定义视图。因此,navigationBar的leftBarButtonItem的单击区域是leftView的框架。即框架:CGRectMake(0,0,30,30)。
答案 5 :(得分:0)
我可以提供的是使用自定义视图创建UIBarButtonItem
let view = CustomView()
let itemButton = UIBarButtonItem(customView: view)
然后覆盖此视图的touchesEnded
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
if touches.count == 1,
let touch = touches.first {
let touchPoint = touch.location(in: self)
if bounds.contains(touchPoint) {
someAction()
}
}
}
不要忘记在init isUserInteractionEnabled = true
中的某处启用用户交互。