iOS 7 навигационная панель фоновое изображение проблема


Я использую изображение в качестве фонового изображения панели навигации. Для установки изображения я использовал следующий код:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav_logo_ios7.png"] forBarMetrics:UIBarMetricsDefault];

Для iOS7 " nav_logo_ios7.png " размер изображения составляет 768x64, а для iOS6 и ниже я использовал изображение размером 768x44.

Это хорошо работает на всех UIViewControllers.

Введите описание изображения здесь

В том же проекте я использую UIActivityViewController. На iOS7 mail compose view выглядит так:

Введите описание изображения здесь

Как я могу справиться с этим?

Заранее благодарю.

2 2

2 ответа:

Проблема, с которой вы столкнулись, заключается в том, что когда UIViewController представлен модально, строка состояния не включена в высоту UINavigationBar.

Это означает, что изображение 64pt неверно.

Во-первых, официальный и лучший способ проверить, какая версия iOS работает устройство будет делать что-то вроде этого:

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
{
    //handle iOS 7 Stuff
}
else
{
    //handle older iOS versions
}

Для получения дополнительной информации проверьте Заголовок NSObjCRuntime.h.

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

UINavigationController позволяет инициализировать экземпляр с помощью пользовательских классов UINavigationBar и UIToolbar.initWithNavigationBarClass:toolbarClass:... Это означает, что вы можете инитировать любые представления, которые вы не представляете модально с другим Подкласс UINavigationBar для представлений, которые модально представлены.

Это означает, что вы сможете указать различные фоновые изображения в зависимости от того, представлен ли ваш навигационный контроллер модально или нет, например:

UIImage *backgroundImage44pts = [UIImage imageNamed:@" ... "];
UIImage *backgroundImage64pts = [UIImage imageNamed:@" ... "];

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
{
    //handle iOS 7 Stuff
    [[UINavigationBar appearance] setBackgroundImage:backgroundImage44pts forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBarSubclass appearance] setBackgroundImage:backgroundImage64pts forBarMetrics:UIBarMetricsDefault];
}
else
{
    //handle older iOS versions
    [[UINavigationBar appearance] setBackgroundImage:backgroundImage44pts forBarMetrics:UIBarMetricsDefault];
}

Важно отметить, что MFMailComposeViewController не является реальным контроллером представления, поэтому попытка инициализировать его с помощью пользовательских подклассов панели навигации может не сработать.. Именно поэтому я использовал пользовательский подкласс панели навигации для всех немодальных навигационных контроллеров, а не наоборот.

Еще следует отметить, что если ваше приложение универсально, то модальные представления не существуют (если у вас нет ничего пользовательского), и вам не придется беспокоиться об этом.

Как я уже говорил ранее... UINavigationBars на самом деле не предназначены для фоновых изображений фиксированного размера (вот почему это так трудно достичь), так что если вы думаете, что эта работа вокруг слишком сложна, то, возможно, это было бы хорошей идеей переосмыслить свой дизайн.

И одна последняя вещь (я обещаю)... Одно из главных изменений в дизайне iOS 7 заключается в том, что содержимое панели навигации перемещается под строкой состояния.. Добавление изображения, чтобы предотвратить это и заменить его сплошным белым фоном, кажется довольно странным для приложения iOS 7.

//In `AppDelegate.m`

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0)
    {
        [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav_bg.png"] forBarMetrics:UIBarMetricsDefault];


        [[UINavigationBar appearance] setTitleTextAttributes:
         @{
           UITextAttributeTextColor: [UIColor whiteColor],UITextAttributeTextShadowColor: [UIColor clearColor],UITextAttributeTextShadowOffset: [NSValue valueWithUIOffset:UIOffsetMake(0.0f, 1.0f)],UITextAttributeFont: [UIFont fontWithName:@"ArialMT" size:18.0f]
        }];


        CGFloat verticalOffset = -4;
        [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:verticalOffset forBarMetrics:UIBarMetricsDefault];
    }
    else
    {
        [[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];

        // Uncomment to change the color of back button
        [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

        // Uncomment to assign a custom backgroung image
        [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav_bg_ios7.png"] forBarMetrics:UIBarMetricsDefault];

        // Uncomment to change the back indicator image

        [[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@""]];
        [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@""]];

        // Uncomment to change the font style of the title

        NSShadow *shadow = [[NSShadow alloc] init];
        shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
        shadow.shadowOffset = CGSizeMake(0, 1);

        [[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:[UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName,shadow, NSShadowAttributeName,[UIFont fontWithName:@"ArialMT" size:18.0], NSFontAttributeName, nil]];

        CGFloat verticalOffset = -4;
        [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:verticalOffset forBarMetrics:UIBarMetricsDefault];
    }

self.window.rootViewController = self.navigationController;

    [self.window makeKeyAndVisible];
    return YES;
}