Правильное решение до iOS5, рекомендованное инженерами Apple, состоит в том, чтобы не использовать категории и не использовать метод swizzling. Это подтверждается, чтобы сломаться на iOS 5, которая очень близка к выпуску.
Вместо этого вы должны создать подкласс UINavigationBar
, переопределить метод drawRect:
, а затем использовать Interface Builder для определения контроллера навигации. Интерфейсный Разработчик позволит вам изменить имя класса для панели навигации на ваш собственный подкласс:


Если вы хотите избежать Interface Builder, вы можете создать временный XIB и загрузить из него экземпляр контроллера навигации, а затем использовать NSKeyedArchiver
для его архивирования в файл. Затем используйте xxd -i <filename>
в командной строке для генерации C-кода для необработанных байтов контроллера навигации. Затем вставьте это в исходный файл и разархивируйте его, когда вам нужен экземпляр.
Вроде бы много работы, но видео и инженеры WWDC на форумах неоднократно заявляли, что это единственный безопасный и надежный способ сделать то, что вы хотите.
В iOS 5 все становится намного проще.