Я создал подкласс UINavigationBar, чтобы в моем приложении была настраиваемая панель навигации. Панель повторно используется на нескольких контроллерах представления с той же кнопкой меню стиля, что и элемент левой кнопки, поэтому она разделена на подклассы.
Затем подкласс добавляется на панель навигации View Controllers в раскадровке.
Это код внутри подкласса UINavigationBar
:
- (void)drawRect:(CGRect)rect
{
// Drawing code
UIImage *image = [[UIImage imageNamed: @"mainNavBar"] resizableImageWithCapInsets:UIEdgeInsetsMake(0,5,0,5)];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
-(void)awakeFromNib {
UIButton *leftButton = [[UIButton alloc]initWithFrame:CGRectMake(7.0f, 7.0f, 38.0f, 29.0f)];
[leftButton setImage:[UIImage imageNamed:@"menuBarItem"] forState:UIControlStateNormal];
[leftButton addTarget:nil action:@selector(menuItemPressed:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:leftButton];
}
Проблема заключается в вращении устройства. У меня также есть код в appDidFinishLaunching
, использующий API внешнего вида для дополнительной настройки:
// Custom Navigation Bar appearance setup
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], UITextAttributeTextColor,
[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5],UITextAttributeTextShadowColor,
[NSValue valueWithUIOffset:UIOffsetMake(0, 1)],
UITextAttributeTextShadowOffset,nil]];
// Used to deal with the rotation of the nav bar when implemented outside of Navigation Controller
[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleHeight];
[[UINavigationBar appearance] setContentMode:UIViewContentModeScaleAspectFit];
// Used to push the title down slightly when in Landscape and NavBar outside of Navigation Controller
[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:2 forBarMetrics:UIBarMetricsLandscapePhone];
Когда устройство вращается, все работает правильно с точки зрения масштабирования полосы по высоте, как и ожидалось, от 44 до 32 пикселей. Однако кнопки по-прежнему отображаются за пределами панели.
Я просмотрел несколько других сообщений SO по этому поводу, но не могу понять, как это правильно выполнить: iPhone: UINavigationBar с кнопками - отрегулируйте высоту
Автоматическое изменение размера UINavigationBar
В идеале я не хочу иметь дело с автоматическим вращением в контроллере представления, потому что этот UINavigationBar повторно используется через большое количество виртуальных каналов. Добавление кода автоматической ротации означало бы, что это тоже может понадобиться каждому венчурному капиталу?
ИЗМЕНИТЬ - следующий ответ Если я изменю awakeFromNib
, чтобы включить следующее:
UINavigationItem* ni = [[UINavigationItem alloc] initWithTitle:@"Test"];
UIImage *menuBgImage = [UIImage imageNamed:@"menuBarItem"];
UIBarButtonItem *b =[[UIBarButtonItem alloc] initWithImage:menuBgImage landscapeImagePhone:menuBgImage style:UIBarButtonItemStylePlain target:nil action:@selector(menuItemPressed:)];
ni.leftBarButtonItem = b;
self.items = @[ni];
У меня проблема с UIBarButtonItemStylePlain, разрушающим изображение:
Если я завершу предыдущую настройку с помощью initWithCustomView и использую leftButton из исходного кода. С помощью leftButton, использующего автоматическое изменение размера для высоты, я получаю плохо растянутое изображение в альбомной ориентации?
ИЗМЕНИТЬ 2 - Дополнительное изображение для каждого ответа