更改UINavigationBar中的UIBarButtonItem的宽度

我正在创build一个UIBarButtonItem并将其添加到我的导航栏,如下所示:

(void)viewDidLoad { ... // Add the refresh button to the navigation bar UIButton *refreshButton = [UIButton buttonWithType:UIButtonTypeCustom]; [refreshButton setFrame:CGRectMake(0,0,30,30)]; [refreshButton setImage:[UIImage imageNamed:@"G_refresh_icon.png"] forState:UIControlStateNormal]; [refreshButton addTarget:self action:@selector(refreshData) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *refreshBarButton = [[[UIBarButtonItem alloc] initWithCustomView:refreshButton] autorelease]; self.navigationItem.leftBarButtonItem = refreshBarButton; } 

我运行时看起来是正确的,但是我可以通过点击导航栏从x = 0到大约100的任何位置来select栏button项目。如何将可选区域的宽度调整为30 px?

达伦

您可能会考虑的一种方法是通过调用initWithCustomView来创build一个UIBarButtonItem。 这是不理想的,因为你没有得到“select”状态,你必须合并你的边框背景(如果你想看看)与你的button图像,但是,你可以更直接地指定一个框架工具栏项目。 如果您使用的是标题而不是图片的文字,则可能仍然需要将背景图片添加为子视图。 无论如何,我现在有同样的问题,这个代码为我工作:

 UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"button-image.png"]]; imageView.frame = CGRectMake(0, 0, 43, 30); UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:imageView]; self.navigationItem.leftBarButtonItem = barButtonItem; 

现在,这是我知道限制UIBarButtonItems添加到UINavigationController的navigationItem的自动resize的唯一方法。

[EDITED]

或者试试Maggie的解决scheme,比我的解决scheme更彻底 。

您可以通过从界面构build器中将图像拖放到栏button项并使用以下代码更改自定义视图的宽度来完成此操作:

 CGRect frame = self.navigationItem.leftBarButtonItem.customView.frame; frame.size.width = 141; self.navigationItem.leftBarButtonItem.customView.frame = frame; 

关键是要意识到你正在改变自定义视图的宽度,而不是UIBarButton本身。

代码是:

 CGRect resizedFrame = myBarButtonItem.customView.frame; resizedFrame.size.width = myNewWidth; myBarButtonItem.customView.frame = resizedFrame; 

您还需要触发布局更改:

 [myNavigationBar setNeedsLayout]; 

所有这一切都不用说,布局正在与自动resize和框架。 带有自动布局的导航栏的入侵没有取得成功。 使用UINavigationBar和UIBarButtonItem查看我的问题自动布局 。

抱歉只是意识到我的代码几乎和@oscartzombie一样。 不是故意的! 我将留下这个答案,因为我觉得值得添加布局和其他要点,除了解释没有参考接口布尔或图像具体。

下面的方法工作,看代码来改变button的宽度和高度,以及添加行动项目。

 UIButton *imageButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 22, 22)]; [imageButton setBackgroundImage:[UIImage imageNamed:@"message_button"] forState:UIControlStateNormal]; [imageButton addTarget:self action:@selector(messageButtonTapped) forControlEvents:UIControlEventAllEvents]; UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:imageButton]; self.navigationItem.leftBarButtonItem = leftBarButtonItem; 

注意:UIBarButtonItem的目标和操作不适用于图像视图