По состоянию на 2012 год, как лучше всего реализовать собственный стиль панели навигации на iOS 4.

Я знаю два метода, и у каждого есть свои недостатки:

Ребята, вы знаете какой-нибудь лучший метод? (Опять же, это для iOS 4.0, так как мне нужно, чтобы приложение было совместимо с iOS 4.0+)

Спасибо, парни,


person Van Du Tran    schedule 12.01.2012    source источник


Ответы (2)


Вам, вероятно, понадобятся два метода, обусловленные версией ОС. Это связано с тем, что в версии 5.0 и более поздних версиях функция drawRect не вызывается. Вместо этого в версии 5.0 есть собственные процедуры для пользовательской панели навигации. В итоге я использовал методы 4.0 и 5.0, а также определял версию и выбирал подходящую во время выполнения.

Что касается первого метода, я не понимаю, зачем вам действительно нужен конструктор интерфейсов. Просто программно создайте экземпляры своих объектов и добавьте их в качестве подпредставлений. Сам построитель интерфейсов не делает ничего большего — это просто более удобный способ работы с ними.

person Owen Hartnett    schedule 12.01.2012
comment
Причина, по которой используется IB, заключается в том, что navigationBar на UINavigationController доступен только для чтения. Но, создав подкласс и изменив класс панели навигации в IB, вы можете заставить контроллер навигации заполнить его свойство navigationBar экземпляром вашего подкласса, который реализует -drawRect:. - person Mark Adams; 12.01.2012
comment
Оуэн, можешь поделиться своим методом? - person Van Du Tran; 13.01.2012

На самом деле, нет необходимости изменять методы, добавлять категории или использовать Interface Builder, вместо этого вы можете создать подкласс UINavigationBar и использовать NSKeyedUnarchiver, чтобы изменить класс UINavigationController.navigationBar на свой пользовательский подкласс.

+ (UINavigationController*)customizableNavigationControllerWithController:(UIViewController*)controller {

NSAssert(controller != nil, @"UINavigationController(CustomNavigationBar) customizableControllerWithController: controller can not be nil");

UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:nil] autorelease];

NSData *navControllerData = [NSKeyedArchiver archivedDataWithRootObject:navController];

NSKeyedUnarchiver *unarchiver = [[[NSKeyedUnarchiver alloc] initForReadingWithData:navControllerData] autorelease];

[unarchiver setClass:[CustomNavigationBar class] forClassName:@"UINavigationBar"];

UINavigationController *customizableNavController = [unarchiver decodeObjectForKey:@"root"];

customizableNavController.viewControllers = [NSArray arrayWithObject:controller];

return customizableNavController;

}

person bretdabaker    schedule 28.01.2012