Изменение ширины UIBarButtonItem в UINavigationBar

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

Ответ 1

Даррен,

Один из подходов, который вы можете рассмотреть, - создание 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, добавленных в элемент навигации UINavigationController.

[Изменено]

Или попробуйте решение Maggie, которое более тщательное, чем мое.

Ответ 2

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

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

Ответ 3

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

Таким образом, код:

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

Вам также потребуется вызвать изменение макета:

[myNavigationBar setNeedsLayout];

Все это само собой разумеется, что макет выполняется с помощью Auto Sizing и frames. Включение в навигационные панели с автоматической компоновкой не принесло успеха. См. Мой вопрос Автоматическая компоновка с UINavigationBar и UIBarButtonItem.

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

Ответ 4

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

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