2010-07-28 5 views
4

Я знаю, что некоторые из них уже задали вопрос, но до сих пор ответы не были конкретными.UIBarButtonItem имеет слишком большую область щелчка

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

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

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

«Я» является корнем ViewController из NavigationController.

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

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

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

ответ

0

Вы не можете многое сделать в области касания. Все это основано на том, как область пальца поднимается на дисплее. Вы можете рассчитать size of touch area (предупреждение: недокументированный api), но перехват событий касания и вызов метода для исправления синдрома толстого пальца кажутся немного превышенными.

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

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

Мне кажется, что это немного странно. Будучи способным кликать до половины 1-й ячейки и запускать правый барабан, на самом деле не помогает жирным пальцам, потому что толстые пальцы имеют только половину этой ячейки, чтобы вызвать его. В любом случае, спасибо за информацию. – DEIONaLiMs

+0

Да, это не идеальная система, но везде есть такие ситуации, что вам просто нужно найти небольшие обходные пути. – iwasrobbed

+0

На самом деле это все еще не имеет смысла ... Если бы это было так, то это было бы одинаково для всех элементов пользовательского интерфейса? У меня есть кнопка раскрытия подробностей только под моим UIBarButtonItem, и область касания UIBarButtonItem является единственной, которая аномально большая ... настолько большая, что она фактически перекрывает некоторые из моих кнопок раскрытия подробностей. – Marius

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]; 

Это отлично работает для меня ....

+3

не работает для меня: по-прежнему можно активировать кнопку, щелкнув вне NavigationBar. –

0

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

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

0

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

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

в @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

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

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

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() 
     } 
    } 
} 

Не забудьте сделать это взаимодействие с пользователем включен где-то в инициализации isUserInteractionEnabled = true.

Смежные вопросы