Вопрос
Как установить изображение в качестве фона панели навигации без использования категории drawRect? Автор вопроса: Steve 08.09.2011 Ответов: 3
Я хочу установить фоновое изображение для панели навигации в моем приложении для iphone. Большинство решений предлагают использовать drawRect в таких категориях, как:
@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
Однако Apple этого не рекомендует . Любое другое предложение?
Спасибо за помощь,
Стефан
ios iphone uinavigationcontroller uinavigationbar ios4
Ответы Ответ 1 · рейтинг 4 · Jilouc
Apple настоятельно рекомендует нам использовать подклассы, а не категории (WWDC 2011, сессия 123).
Создайте подкласс, который реализует метод drawRect:, и установите класс панели навигации на свой собственный класс:
если вы работаете в Interface Builder, измените класс в инспекторе
если вы создаете автономную панель навигации (без контроллера навигации), создайте экземпляр своего пользовательского класса
если вы создаете контроллер навигации программно, вы можете воспользоваться преимуществами среды выполнения ObjC.
Переключение класса во время выполнения:
#import <objc/runtime.h>
...
object_setClass(theNavController.navigationBar, [CustomNavigationBar class]);
Вам также следует избегать использования [UIImage imageNamed:...] каждый раз в drawRect:, поскольку это может повлиять на производительность (для анимации). Кешируйте его в ivar:
if (!bgImage) {
bgImage = [[UIImage imageNamed:@"NavigationBar.png"] retain];
}
[bgImage drawInRect:...];
(и отпустите его в dealloc)
Примечание. Поскольку iOS 5 все еще находится под соглашением о неразглашении, я не могу упомянуть, как можно легко добавить фоновое изображение. Ознакомьтесь с документацией для UINavigationBar.
Ответ 2 · рейтинг 2 · Vijay-Apple-Dev.blogspot.com
Протестированный код: 100% работает
в ur ViewDidLoad
UIImageView *iv=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"urNavBarImage.png"]];
self.navigationItem.titleView = iv;
[iv release];
ПРИМЕЧАНИЕ. urNavBarImage должен соответствовать размеру панели навигации. Таким образом вы можете изменить каждую панель навигации Viewcontroller.
Ответ 3 · рейтинг 1 · Nikunj Jadav
Я создал настраиваемую категорию для UINavigationBar следующим образом
UINavigationBar+CustomImage.h
#import <UIKit/UIKit.h>
@interface UINavigationBar (CustomImage)
- (void) setBackgroundImage:(UIImage*)image;
- (void) clearBackgroundImage;
- (void) removeIfImage:(id)sender;
@end
UINavigationBar+CustomImage.m
#import "UINavigationBar+CustomImage.h"
@implementation UINavigationBar (CustomImage)
- (void) setBackgroundImage:(UIImage*)image {
if (image == NULL) return;
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(110,5,100,30);
[self addSubview:imageView];
[imageView release];
}
- (void) clearBackgroundImage {
NSArray *subviews = [self subviews];
for (int i=0; i<[subviews count]; i++) {
if ([[subviews objectAtIndex:i] isMemberOfClass:[UIImageView class]]) {
[[subviews objectAtIndex:i] removeFromSuperview];
}
}
}
@end
Я вызываю его из своего UINavigationController
[[navController navigationBar] performSelectorInBackground:@selector(setBackgroundImage:) withObject:image];
Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow .