UIBarButtonItem имеет слишком большую область щелчка - PullRequest
4 голосов
/ 28 июля 2010

Я знаю, что некоторые уже задавали вопрос, но на данный момент ответы на самом деле не конкретны.

Очевидно, что Apple сделала область щелчка на NavigationBar больше, чем она есть на самом деле, но я не думаю, что она должна быть такой большой.

В моем приложении под NavBar есть TableView, и вы можете щелкнуть до половины первой ячейки, чтобы вызвать событие rightBarButtonItem. кнопка выглядит так:

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

«self» является корневым ViewController для NavigationController.

Как вы могли догадаться, это проблема, поскольку ячейки выбираются для нажатия другого ViewController.

Мне удалось обойти проблему, увеличив высоту ячеек, но я бы предпочел, чтобы они имели обычный размер.

Я уверен, что я не единственный с этим случаем сценария. Заранее спасибо.

Ответы [ 6 ]

8 голосов
/ 25 февраля 2013
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];

Это прекрасно сработало для меня ....

0 голосов
/ 12 сентября 2017

Все, что я могу предложить, - это создать 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.

0 голосов
/ 10 февраля 2016

Мы не можем уменьшить размер uibarbuttonitem по умолчанию.Идея состоит в том, чтобы сделать uibutton, добавить к uiview, а затем к пользовательскому представлению uibarbuttonitem.Размер uiview, содержащего uibutton, будет область щелчка 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)

Примечание: Пример: - кнопка меню представляет собой кнопку UIB и добавлена ​​в левое окно обзора.LeftItem является UIBarButtonItem и добавляется в leftBarButtonItem навигационной панели.LeftView добавляется как пользовательский вид leftItem.Таким образом, область щелчка leftBarButtonItem панели навигации является рамкой leftView.т. е. кадр: CGRectMake (0,0,30,30).

0 голосов
/ 08 октября 2014

Поскольку я использую прозрачную панель инструментов и подкрашиваю UIBarButtonItem, я не смог использовать пользовательский вид, так как мне нужно было бы установить оттенок, ширину / высоту, закругленные углы, чтобы он был похож на UIBarButtonItem

Iпоэтому используйте невидимую кнопку, которую я добавляю к своим предметам, чтобы решить эту проблему.и события там фиксируются

в @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] ];
0 голосов
/ 07 июня 2014

Другой ответ от iosDeveloper о размещении контейнера вокруг кнопки может помочь уменьшить размер интерактивной области слева и справа от кнопки, но не помогает решить проблему, с которой вы столкнулись при активацииНажатие кнопки под панелью навигации.

После нескольких часов поиска нескольких разных SO-тем и проб разных вещей, я наконец нашел свой ответ на этот вопрос здесь: https://stackoverflow.com/a/10597699/1289240

0 голосов
/ 28 июля 2010

С сенсорной областью ничего не поделаешь.Все зависит от того, сколько пальцев выбрано на дисплее.Вы можете вычислить размер области касания (предупреждение: недокументированный API), но перехват событий касания и вызов метода для исправления синдрома толстого пальца кажется немного чрезмерным.

Базовый процессis:

  1. Вы касаетесь экрана
  2. Изменение емкости измеряется в уникальной индивидуальной части экрана и отправляется на аппаратное / программное обеспечение для интерпретации (как и в сторону, патент Appleзаявляет, что одновременно можно отслеживать до 15 касаний .. 10 пальцев, две ладони и еще 3 в случае, если вы когда-нибудь создадите игру «Твистер» для iPhone)
  3. Программное обеспечение интерпретирует градиенты вемкость на экране и определяет границы касания
  4. Программное обеспечение вычисляет центр тяжести касания на основе средней величины емкости для каждого пикселя или точки в области
  5. Программное обеспечение отправляет координаты местоположений границы касания в приложение
  6. Ваше приложение интерпретируется как сенсорное событие, оно отправляется по цепочке респондента, и (мы надеемся)Пользователь видит прикосновение на экране
...