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