2015-01-26 3 views
2

Я внедрил SWReveal control в своем приложении. Для тригера действия у меня есть UIBarButtonItem с пользовательским представлением. Ну, все работает нормально, но я заметил, что я могу запустить событие даже при нажатии вдали от изображения (изображение шириной около 44 пикселей и нажатие до 100 пикселей).Ограничьте область с щелчком левой панели на размер пользовательского uibarbuttonitem

Я искал какое-то время, и самое лучшее решение, которое я ве нашел (определение пользовательской кнопки и инстанцировании UIBarButtonItem с «initWithCustomView»)

Это мой предыдущий код:

UIBarButtonItem *revealButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"reveal-icon"] style:UIBarButtonItemStylePlain target:_revealController action:@selector(revealToggle:)]; 
self.navigationItem.leftBarButtonItem = revealButtonItem; 

и код с «решением»:

//create the image for your button, and set the frame for its size 
UIImage *image = [UIImage imageNamed:@"reveal-icon"]; 
CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height); 
//init a normal UIButton using that image 
UIButton* button = [[UIButton alloc] initWithFrame:frame]; 
[button setBackgroundImage:image forState:UIControlStateNormal]; 
[button addTarget:_revealController action:@selector(revealToggle:) forControlEvents:UIControlEventTouchUpInside]; 
//finally, create your UIBarButtonItem using that button 
UIBarButtonItem* revealButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 

self.navigationItem.leftBarButtonItem = revealButtonItem; 

с этим позже кодом, который я знаю, у меня есть кнопка правильного размера (я в установить BackgroundColor, и проверил кор прямоугольный размер кнопки), но все же срабатывает при нажатии далеко от кнопки.

¿любые идеи?

Заранее спасибо.

+0

Не отвечая на ваш вопрос, но: Почему вы хотите это сделать? Существует причина, по которой iOS увеличивает зону действия кнопок панели. Кажется, у вас есть кнопка меню (как единственная кнопка слева), и я действительно не вижу никакого преимущества, заключающегося в том, что явная область, касающаяся касания, меньше, чем значение по умолчанию. И: Проверьте это на устройстве, а не на симуляторе !! –

+0

Ваши пользователи убьют вас, если у вас будет осязаемая область размером около 20x20pt (просто угадайте размер вашего значка) .. ;-) –

+0

Я прочитал руководство человека по яблоку, и я не притворяюсь, что сделаю такие кнопки litle , но, как я уже сказал в этом вопросе, проблема в том, что выбираемая область намного больше, чем фактический размер кнопки (вы можете увидеть ту же проблему в другом известном приложении, где у вас есть пользовательское изображение, работающее как кнопка , но нажатие далеко от него запустит действие. Но в приложении facebook вы увидите, что этот beaheaviour исправлен. :) – raululm

ответ

0

Постарайтесь с button.clipsToBounds = YES;, но я должен согласиться с другими комментариями, согласно iOS Human Interface Guidelines от Apple, каждая разрешаемая область должна быть не менее 44x44.

+0

Я уже пробовал это и не работал :(Я абсолютно согласен с вами в области tappable, но область навигации на панели навигации, когда у вас есть только одна кнопка, больше фактического размера кнопки (и моя кнопка измеряет 44x44), и для моих клиентов это немного странно касаться, когда нет кнопки, и кнопка все равно нажимается. Большое спасибо :) – raululm

0

Пользовательский маршрут просмотра, похоже, работает для меня, но я нашел другое решение, которое вы можете попробовать, если это не работает для вас. кажется, что область, подлежащая разрешению, распространяется только до тех пор, пока она не ударит то, что пользователь может коснуться. У меня есть заголовок, который пользователь может нажать, чтобы что-то сделать, поэтому исчезающая область моего leftbarbuttonitem останавливается. но я также попытался добавить еще один uiview с userinteractionenabled, установленным в yes, чуть чуть правее левой панели и, похоже, не расширяет область. Я смог использовать только стандартный двухстрочный код вместо обычного. не уверен, если это будет работать для вас или нет

0
It is hard to make uibarbuttonitem touch area override. We can achieve the same using subclassing uinavigationbar. 

File-New-CocoaTouch Class-UINavigationBar- Name it. 

This is mine: 

import UIKit 
import Foundation 

let navigationItem : UINavigationItem = UINavigationItem() 

class CustomNavigationBar: UINavigationBar { 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     self.backgroundColor = UIColor.redColor() 
    } 
    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder)! 
    } 
    override func drawRect(rect: CGRect) { 

    } 
    func addUIButtonToUIBarButtonitems(leftButton:UIButton,leftButtonFrame:CGRect,rightButton:UIButton,rightButtonFrame:CGRect) 
    { 
     let leftView = UIView(frame: leftButtonFrame) 
     leftView.addSubview(leftButton) 

     let leftItem:UIBarButtonItem = UIBarButtonItem(customView: leftView) 
     navigationItem.leftBarButtonItem = leftItem 

     let rightView = UIView(frame: rightButtonFrame) 
     rightView.addSubview(rightButton) 

     let rightItem:UIBarButtonItem = UIBarButtonItem(customView: rightView) 
     navigationItem.rightBarButtonItem = rightItem 

     items = [navigationItem] 
    } 
} 

I have a method for setting uibuttons as uibarbuttonitems. On View Controller, I will add two unbuttons and will pass the same to the navigation bar. The frame of the unbutton will be the click area of the respective uibattonitem. 

class CustomNavBarVC: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.styleCustomNavigationBar() 
    } 

    func styleCustomNavigationBar() { 

     self.navigationController?.setNavigationBarHidden(true, animated: false) 

     let navigationBar : CustomNavigationBar = CustomNavigationBar(frame: CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), 64.0)) 

     //menu button 
     let menubutton: UIButton = UIButton(frame: CGRectMake(0,0,30,30)) 
     menubutton.setImage(UIImage(named: "menu"), forState: UIControlState.Normal) 
     menubutton.addTarget(self, action: "backButtonDidClicked", forControlEvents: UIControlEvents.TouchUpInside) 

     //search button 
     let searchbutton: UIButton = UIButton(frame: CGRectMake(0,0,30,30)) 
     searchbutton.setImage(UIImage(named: "search1x"), forState: UIControlState.Normal) 
     searchbutton.addTarget(self, action: "backButtonDidClicked", forControlEvents: UIControlEvents.TouchUpInside) 


     navigationBar.addUIButtonToUIBarButtonitems(menubutton, leftButtonFrame: CGRectMake(0,0,30,30), rightButton: searchbutton, rightButtonFrame: CGRectMake(0,0,30,30)) 

     self.view.addSubview(navigationBar) 
    } 

    func backButtonDidClicked() 
    { 
     print("CLICK ") 
    } 
} 
0

Вы можете попробовать это button.clipsToBounds = YES;

Это может помочь вам.

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