2012-06-11 3 views
13

Я создаю UIBarButtonItem и добавить его к моей навигационной панели, как так:Изменение ширины UIBarButtonItem в UINavigationBar

(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. Как я могу настроить выбранную область шириной 30 пикселей?

+2

Я боюсь, что я не думаю, что есть способ, чтобы настроить выбираемые область. Вопрос, хотя, почему вы хотите, чтобы ширина была 30 px? В руководстве iOS Human Interface Guideline указано, что удобный минимальный размер отображаемых элементов пользовательского интерфейса составляет 44 х 44 точки. http://developer.apple.com/library/ios/# documentation/UserExperience/Conceptual/MobileHIG/Характеристики/Characteristics.html –

+0

Хм, хорошо спасибо за ссылку на рекомендации. Кажется немного странным, что выбираемая область настолько широка, хотя. – Darren

+0

@AbdSaniAbdJalal можно изменить ширину 'barbuttonitem' в раскадровке? – aircraft

ответ

12

Даррен,

Один подход можно рассматривать как создание UIBarButtonItem по телефону initWithCustomView. Это не идеально, потому что вы не получаете «выбранных» состояний из коробки. И вы должны комбинировать свой граничный фон (если хотите, чтобы посмотреть) с вашим изображением кнопки, но с этим вы можете более точно указать кадр для своего элемент панели инструментов. Если вы используете текст для своего названия вместо изображений, вам все равно может понадобиться добавить фоновое изображение в качестве подзаголовка. Во всяком случае, у меня та же проблема, прямо сейчас, и этот код работает для меня:

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 добавлен в navigationItem в UINavigationController в ,

[Изменено]

Или try Maggie's solution, which is more thorough than mine.

+2

работал только тогда, когда я использовал 'UIButton' как customView, а не' UIImageView' – Kreutzer

+1

, это решение не будет работать, поскольку оно вообще не имеет действий с кнопками. Вместо этого используйте 'UIButton'. – Raptor

6

Вы можете сделать это путем сбрасывания изображения для элемента панели кнопок от интерфейса строителя и изменения ширины пользовательского вида с этим кодом:

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

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

Код поэтому:

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

Вам также необходимо, чтобы вызвать изменение макета:

[myNavigationBar setNeedsLayout]; 

Все это само собой разумеется, что макет делается с автоматической калибровки и кадров. Включение в навигационные панели с автоматической компоновкой не принесло успеха. См. Мой вопрос Auto Layout with UINavigationBar and UIBarButtonItem.

Извините, только что понял, что мой код почти идентичен @oscartzombie. Не намеренно! Я оставлю этот ответ, поскольку я думаю, что стоит добавить макет и другие пункты, в дополнение к объяснению без ссылки на Interface Bulder или изображения в частности.

+0

У меня были проблемы с размером моего пользовательского UIBarButtonItem, решение вызывало '[self.navigationController.navigationBar setNeedsLayout];' в моем представлении контроллера '- (void) viewDidLoad' метод. – LunaCodeGirl

5

Следующий подход работал, см. Код для изменения ширины и высоты кнопки и для добавления элемента действия.

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 не распространяется на вид изображения

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