Пользовательский фон для UINavigationBar в ландшафтном режиме
-
22-08-2019 - |
Вопрос
Я добавляю собственный фон для своего UINavigationBar.Все работает нормально, пока телефон находится в портретном режиме.Как только я переключаюсь в альбомный режим, половина панели становится синей (цвет навигационной панели по умолчанию), а половина - моим изображением.
Как я могу растянуть изображение для ландшафтного режима и снова сделать его маленьким для портретного режима?
Спасибо
Решение
Если кто-то ищет ответ на вопрос, как добавить изображение на панель навигации — вот оно.
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 480.0, 44.0)];
[imgView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"navbar_landscape" ofType:@"png"]]];
[navigationController.navigationBar addSubview:imgView];
[imgView release];
Решение
Вероятно, вам потребуется установить маску автоматического изменения размера вашего фонового изображения;попробуйте использовать UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
Другие советы
В обоих режимах ориентации экрана гораздо лучше использовать
[navigationController.navigationBar insertSubview:imgView atIndex:0];
Это помещает вид изображения ниже всех других представлений, и все элементы панели навигации по умолчанию (заголовок, стандартные кнопки) работают нормально.
После небольшого исследования, поиска и ошибок я нашел обходной путь, который не заменяет панель навигации при входе в режим воспроизведения фильма.Надеюсь, это не вызовет проблем с одобрением приложения, но, основываясь на этом посте, я думаю, что все будет в порядке:
http://developer.apple.com/iphone/library/qa/qa2009/qa1637.html
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
if([self isMemberOfClass: [UINavigationBar class]]){
UIImage *image = [UIImage imageNamed:@"navBarBackground.png"];
CGContextClip(ctx);
CGContextTranslateCTM(ctx, 0, image.size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextDrawImage(ctx, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}else{
[super drawLayer:layer inContext:ctx];
}
}
@end
Решение, которое дал Бен, решило проблему, но оно растягивает изображение в альбомном режиме.В итоге я создал два изображения — одно для пейзажного режима, а другое для портретного.Затем я добавил код в mustAutoRotate, чтобы изменить изображение панели навигации в зависимости от ориентации.
Вы можете изменить изображение как для книжной, так и для альбомной ориентации, предоставив разные изображения для разных ориентаций, проверив размер кадра этого экземпляра панели UINavigation:
- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
return;
}
UIImage *image = (self.frame.size.width > 320) ?
[UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
CGContextClip(context);
CGContextTranslateCTM(context, 0, image.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}
И этот полный демонстрационный проект Xcode при настройке внешнего вида UINavigationBar может быть полезно.Он также включает @2x версии фоновых изображений для поддержки дисплеев Retina на устройствах iPhone 4.
Попробуйте более простой метод [UIImage imageNamed:@"navbar_landscape.png"]
поскольку элемент пользовательского интерфейса — это именно то, что изображениеИмя: предназначен, как показывает ljonesATL.