UINavigationBar Проблема с фоновым изображением - PullRequest
0 голосов
/ 10 мая 2010

Я установил фон панели навигации с этим кодом в моем делегате приложения:

@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
    UIImage *backgroundImage = [UIImage imageNamed: @"Nav-rightpane.png"];

    CGContextDrawImage(UIGraphicsGetCurrentContext(),
                       CGRectMake(0, 0, self.frame.size.width, self.frame.size.height),
                       backgroundImage.CGImage);
}
@end

Это прекрасно работает, но теперь я должен изменить фон по умолчанию на UIPopoverController. Есть идеи для этого?

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 сентября 2011

Правильное решение до iOS5, рекомендованное инженерами Apple, состоит в том, чтобы не использовать категории и не использовать метод swizzling. Это подтверждается, чтобы сломаться на iOS 5, которая очень близка к выпуску.

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

enter image description here

enter image description here

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

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

В iOS 5 все становится намного проще.

0 голосов
/ 14 января 2011

Не используйте это решение. Просто удалите свою UINavigationBar категорию и внедрите собственную UINavigationController.

@interface XNavigationController : UINavigationController{}

и изменение переопределения метода viewDidLoad в реализации

- (void)viewDidLoad {
    [super viewDidLoad];

    UIImage *img = [UIImage imageNamed: @"Nav-rightpane.png"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:img];
    [imageView setFrame:self.navigationBar.bounds];
    [imageView setContentMode:UIViewContentModeScaleToFill];
    [self.navigationBar addSubview:imageView];
    [imageView release];
}

, поэтому используйте это navigationController, если вы хотите изменить фон панели навигации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...