UINavigationBar и новый API для iOS 5+ - как добавить два фоновых изображения? - PullRequest
8 голосов
/ 14 октября 2011

Я хочу использовать новый API внешнего вида iOS 5 для предоставления пользовательских фоновых изображений для всех экземпляров UINavigationBar в моем приложении. Для этого все так просто:

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

Однако для каждого экземпляра я хочу предоставить другое изображение в зависимости от значения свойства translucent, например,

// For UINavigationBar instances where translucent returns YES:
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"whatever-translucent.png"] forBarMetrics:UIBarMetricsDefault];

// Otherwise:

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

Учитывая, что API внешнего вида, похоже, настроены с использованием методов класса, возможно ли что-то подобное?

Ответы [ 6 ]

4 голосов
/ 14 октября 2011

В настоящее время нет способа сделать то, что вы описываете - внешний прокси-сервер не знает ничего ни о каком конкретном экземпляре в тот момент, когда вы его вызываете.

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

В то же время, не могли бы вы подать запрос на улучшение на http://bugreport.apple.com/ для того, что вы спрашиваете? Это не необоснованный запрос. Спасибо!

4 голосов
/ 14 октября 2011

Вы можете установить его глобально с помощью прокси внешнего вида класса или установить его для экземпляра navBar.

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

UINavigationController *myNavController = [[UINavigationController alloc] initWithRootViewController:myView];
[viewControllers addObject:myNavController];

// not supported on iOS4
UINavigationBar *navBar = [myNavController navigationBar];
if ([navBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])
{
    // right here, you could condition bg image based on properties of this instance
    // of the navBar or any other condition.

    [navBar setBackgroundImage:[UIImage imageNamed:@"bg.jpg"] forBarMetrics:UIBarMetricsDefault];
}

Если вы хотите установить с помощью метода класса, вы можете установить для всех:

[[UINavigationBar appearance] setBackground ...

Я признаю, что это довольно ново, и я просто выясняю это, как и большинство людей.

1 голос
/ 27 ноября 2012

Вы можете сделать это так, если знаете, какие классы содержат полупрозрачные столбцы:

[[UIBarButtonItem appearanceWhenContainedIn:[MyClassWithTranslucentBar class], [MyOtherClassWithTranslucentBar class], nil]
    setTintColor:desiredColor];
1 голос
/ 08 мая 2012

Этот ответ, вероятно, не очень поможет вам, но может быть и другим. Если вы создаете подкласс, вы можете указать внешний вид для каждого подкласса отдельно. Например, у меня есть UITableviewCells и пользовательский класс, производный от UITableViewCells. Я действительно делаю это по какой-то причине, но я обнаружил, что мне нужно вызвать [[UITableViewCells Appearance] setFont: [...]] специально для обоих классов.

Поскольку вы, похоже, хотите сделать это на основе переменной, которую вы не узнаете до времени выполнения, вам, вероятно, не повезло!

0 голосов
/ 27 декабря 2013

Попробуйте это:

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {


        // Load resources for iOS 6.1 or earlier

         navigationController1 = [self customizedNavigationController];
         [navigationController1 setViewControllers:[NSArray arrayWithObject: self.homeViewController]];

         [self setNavigationController:navigationController1];
         [self.window setRootViewController:navigationController];


    } else {
        // Load resources for iOS 7 or later
         navigationController1 = [[UINavigationController alloc] initWithRootViewController:self.homeViewController];
          [self.window setRootViewController:navigationController1];
    }


  - (UINavigationController *)customizedNavigationController {

     UINavigationController *navController = [[UINavigationController alloc]   initWithNibName:nil bundle:nil];

    // Ensure the UINavigationBar is created so that it can be archived. If we do not access the
    // navigation bar then it will not be allocated, and thus, it will not be archived by the
    // NSKeyedArchvier.
    [navController navigationBar];

    // Archive the navigation controller.
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:navController forKey:@"root"];
    [archiver finishEncoding];

    // Unarchive the navigation controller and ensure that our UINavigationBar subclass is used.
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    [unarchiver setClass:[LNTNavigationBar class] forClassName:@"UINavigationBar"];
    UINavigationController *customizedNavController = [unarchiver decodeObjectForKey:@"root"];
    [unarchiver finishDecoding];

    // Modify the navigation bar to have a background image.
    LNTNavigationBar *navBar = (LNTNavigationBar *)[customizedNavController navigationBar];
    [navBar setTintColor:[UIColor colorWithRed:0.39 green:0.72 blue:0.62 alpha:1.0]];
    [navBar setBackgroundImage:[UIImage imageNamed:@"nav_bar_1024_46.png"] forBarMetrics:UIBarMetricsDefault];
    [navBar setBackgroundImage:[UIImage imageNamed:@"nav_bar_1024_46.png"] forBarMetrics:UIBarMetricsLandscapePhone];

    return customizedNavController;
}
0 голосов
/ 27 декабря 2013

Я не могу оставить комментарий, поэтому должен быть ответ. Роб Уитлоу написал отличную статью на эту тему. Проверьте это: http://ios -blog.co.uk / tutorials / ios-custom-ui-series-tabbar-navbar /

...