Пользовательский фон для UINavigationBar в ландшафтном режиме

StackOverflow https://stackoverflow.com/questions/380507

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top