2015-01-26 49 views
2

我已经在我的应用程序上实现了SWReveal控件。为了激发这个动作,我有一个带有自定义视图的UIBarButtonItem。好吧,一切工作正常,但我注意到,即使点击远离图像(约44像素宽的图像,然后点击100像素),我仍然可以触发事件。将左键钮按钮的可点击区域限制为自定义按钮的大小

我一直在寻找了一段时间,我已经找到了最好的解决方案(定义自定义按钮和实例化的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增加了条形按钮项目的可触摸区域。你似乎有一个菜单按钮(作为左边的唯一按钮),我真的没有看到明确使可触摸区域小于默认值的任何优势。并且:在设备上进行测试,而不是在模拟器上进行测试! – 2015-01-26 19:58:27

+0

如果您的可触摸面积仅为20x20pt(只是猜测您的图标的大小),您的用户将会杀了你; ;-) – 2015-01-26 20:00:40

+0

我已经阅读了苹果的人类指南,并且我不会假装制作这样一个小小的按钮,但正如我在问题中所说的那样,问题是可选择的区域比按钮的实际大小大得多(您可以在其他着名的应用程序中看到相同的问题,您可以将自定义图像用作按钮,但是远离它会触发这个动作,但在Facebook应用中,你会看到这个beaheaviour更正了。:) – raululm 2015-02-07 19:58:43

回答

0

请尝试button.clipsToBounds = YES;,但我必须同意其他意见,根据苹果的iOS Human Interface Guidelines,每个可点击面积应至少为44x44。

+0

我已经试过它,并且不要工作:(我绝对同意你关于可点击区域,但是当你只有一个按钮的导航栏的导航区域大于按钮的实际尺寸(和我的按钮尺寸为44x44),对于我的客户来说,当没有按钮时触摸有点奇怪,并且无论如何都可以轻触按钮。非常感谢:) – raululm 2015-03-11 19:39:07

0

自定义视图路径似乎为我工作,但我找到了另一种解决方案,你可以尝试,如果这不适合你。它似乎像可点击区域一直延伸到它碰到用户可以点击的东西。我有一个标题视图,用户可以点击执行某些操作,因此我的左栏按钮的可点按区域停在那里。但我也尝试添加另一个uiview与userinteractionenabled设置为是只是略左右巴钮右侧的,这似乎停止扩展区域。我能够使用两行标准代码而不是自定义。不知道这是否会为你工作或不

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;

这可能会帮助你。