【发布时间】:2011-12-17 07:35:42
【问题描述】:
我想将图像设置为 UINavigationController 背景,但我发现的大多数解决方案都在导航栏中为应用程序中的所有视图应用背景。你能提供一些可能有帮助的代码吗?
感谢您的帮助,
斯蒂芬
【问题讨论】:
标签: iphone ios ios4 uinavigationcontroller uinavigationbar
我想将图像设置为 UINavigationController 背景,但我发现的大多数解决方案都在导航栏中为应用程序中的所有视图应用背景。你能提供一些可能有帮助的代码吗?
感谢您的帮助,
斯蒂芬
【问题讨论】:
标签: iphone ios ios4 uinavigationcontroller uinavigationbar
嗨,斯蒂芬妮·库阿库,
试试这个,它的作品...
UIImageView *bgNavigation= [[UIImageView alloc] initWithImage:[UIImage imageNamed: @"bgNav.png"]];
self.navigationItem.titleView = bgNavigation;
[bgNavigation release];
尤其是View的willAppear方法
【讨论】:
titleView 不适用于背景。
这是我在一个项目中使用的一种快速而肮脏的方式(我不需要支持横向)。我用UINavigationBar 的类别实现了它,方法是调配。适用于 iOS 4 和 5(我没有在 iOS 3 上尝试过)。
UINavigationBar+SYCustomBackground.h
#import <UIKit/UIKit.h>
@interface UINavigationBar (SYCustomBackground)
@property (nonatomic,retain) UIImage *sy_customBackgroundImage;
@end
UINavigationBar+SYCustomBackground.m
#import "UINavigationBar+SYCustomBackground.h"
#import <objc/runtime.h>
@implementation UINavigationBar (SYCustomBackground)
static char BACKGROUND_IMAGE_KEY;
static BOOL drawRectsSwizzled = NO;
// Swizzles drawRect: and sy_drawRect:
- (void)swizzleDrawRectIfNecessary
{
if (!drawRectsSwizzled) {
Method origMethod = class_getInstanceMethod([self class], @selector(drawRect:));
Method myMethod = class_getInstanceMethod([self class], @selector(sy_drawRect:));
method_exchangeImplementations(origMethod, myMethod);
drawRectsSwizzled = YES;
}
}
- (void)setSy_customBackgroundImage:(UIImage *)image
{
// iOS 5
if ([self respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {
[self setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
}
// iOS < 5
else {
[self swizzleDrawRectIfNecessary];
objc_setAssociatedObject(self, &BACKGROUND_IMAGE_KEY, image, OBJC_ASSOCIATION_RETAIN);
}
}
- (UIImage *)sy_customBackgroundImage
{
// iOS 5
if ([self respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {
return [self backgroundImageForBarMetrics:UIBarMetricsDefault];
}
// iOS < 5
else {
[self swizzleDrawRectIfNecessary];
return objc_getAssociatedObject(self, &BACKGROUND_IMAGE_KEY);
}
}
- (void)sy_drawRect:(CGRect)rect
{
UIImage *backgroundImage = self.sy_customBackgroundImage;
if (backgroundImage) {
[backgroundImage drawInRect:rect];
}
else {
// No custom image, calling original drawRect:
// Note: it’s swizzled, so we must call sy_drawRect:
[self sy_drawRect:rect];
}
}
@end
然后,如果您想在一张UINavigationController 中更改图像,则将背景图像设置在viewWillAppear 并在viewWillDisappear 中恢复它们。
它并不完美,我会添加一些淡入淡出过渡,为背景添加推送/弹出,但我还没有时间,所以请随时改进它。
【讨论】:
显然,您已经知道如何将图像设置为导航栏的背景。
如果您需要区分各种视图控制器,则需要更改应该表现不同的一个视图控制器的viewWillAppear 和viewWillDisappear 中的栏。你明白了。
【讨论】:
这是为导航控制器设置背景图像的正确方法。这在 ios 5 中可用。
[navBar setBackgroundImage:[UIImage imageNamed: @"image.png"] forBarMetrics:UIBarMetricsDefault];
【讨论】:
我相信这是 iOS5 的第一个实际答案,主要问题是完成后“删除”背景图像。好吧,只保留现有的。
@implementation MyViewController {
UIImage *_defaultImage;
}
- (void)viewWillAppear:(BOOL)animated {
_defaultImage = [self.navigationController.navigationBar backgroundImageForBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"bar.png"] forBarMetrics:UIBarMetricsDefault];
}
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController.navigationBar setBackgroundImage:_defaultImage forBarMetrics:UIBarMetricsDefault];
}
【讨论】: