UIBarButtonItem的点击区域太大

时间:2010-07-28 16:25:49

标签: iphone uibarbuttonitem

我知道有些人已经提出了这个问题,但到目前为止,答案并不是特定的。

显然苹果已经使NavigationBar的点击区域比实际大,但我不认为它应该那么大。

在我的应用程序中,NavBar下方有一个TableView,你可以一直点击第一个单元格的一半来触发rightBarButtonItem的事件。 按钮的实例如下:

    UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editTable)];
 [[self navigationItem] setRightBarButtonItem:editButton];

“self”是NavigationController的根ViewController。

你可以想象,这是一个问题,因为单元格可以选择推送另一个ViewController。

我设法通过使细胞的高度更大来解决问题,但我宁愿将它们放在常规尺寸上。

我确信我不是唯一一个有这种情况的人。 提前谢谢。

6 个答案:

答案 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),但拦截触摸事件并调用方法来纠正肥胖手指综合症似乎有点过头了。

基本流程是:

  1. 触摸屏
  2. 电容的变化是在屏幕的独特个性化部分中测量的,并发送到硬件/软件进行解释(同样,苹果的专利说明可以跟踪 15 触摸的数量。曾经... 10个手指,两个手掌和另外3个,以防你制作iPhone“Twister”游戏)
  3. 软件解释屏幕上的电容梯度并识别触摸边界
  4. 软件根据区域中每个像素或点的平均电容量值计算触摸质心
  5. 软件将触摸边界位置的坐标发送到应用程序
  6. 您的应用程序将其解释为触摸事件,它将沿着响应者链发送,并且(希望)用户可以看到屏幕上的触摸

答案 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中的某处启用用户交互。