0

我正在开发一个不久前为 iOS 4.2 构建的项目。我不得不为 iPhone 5 等调整一些视图的大小。除了缺少背景图像的 NavigationBar 之外,一切都运行良好。

当我尝试在 iOS 6 上编译它时得到的唯一警告是:

@interface UINavigationBar (HomeBrokerNavigationBar) 

UIView * topItemHeaderView;

Cannot declare variable inside @interface or @protocol.

我注释掉了那行,并在@interface 上写了同一行,所以现在我没有收到任何编译错误,但 NavigationBar 显示没有图像。

这不是我的项目,所以我不想过多地使用控制器。我只是应该更新视图。有人遇到过这种问题吗?事情是这样的:

UIView * topItemHeaderView; 

@interface UINavigationBar (HomeBrokerNavigationBar) 

//UIView * topItemHeaderView; //This caused an error so I commented it and placed the line outside. 

- (void)layoutNavigationBarBackground;
- (void)layoutNavigationBarShadow;
- (void)setTopItemTitle:(NSString *)title andSubtitle:(NSString *)subtitle;
- (void)setTitleForStockWithShortName:(NSString *)stockShortName andLargeName:(NSString *)stockLargeName;
- (void)setFirstActionButtonWithImage:(NSString *)imageName forTarget:(id)target andAction:(SEL)action;
- (void)setSecondActionButtonWithImage:(NSString *)imageName  forTarget:(id)target andAction:(SEL)action;
- (void)setThridActionButtonWithImage:(NSString *)imageName  forTarget:(id)target andAction:(SEL)action;

- (void)setActionButtonWithFrame:(CGRect)frame andImage:(NSString *)imageName forTarget:(id)target andAction:(SEL)action;


@end

和 .m 文件:

- (void)drawRect:(CGRect)rect {

self.topItem.hidesBackButton = YES;

if(!self.hidden)
{
    self.tintColor = [UIColor colorWithRed:0.003922 green:0.137255 blue:0.313726 alpha:1.0];
    
    [self layoutNavigationBarBackground];
    [self layoutNavigationBarShadow];
}
}


- (UIView *)topItemHeaderView {
return topItemHeaderView;
}

- (void)layoutNavigationBarShadow {

    CAGradientLayer * navigationBarShadow;

    navigationBarShadow = [[CAGradientLayer alloc] init];

    navigationBarShadow.frame = CGRectMake(self.frame.origin.x, 0, self.frame.size.width + 20, 20);

    CGColorRef topColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5].CGColor;

    CGColorRef bottomColor = [self.tintColor colorWithAlphaComponent:0.0].CGColor;

    navigationBarShadow.colors = [NSArray arrayWithObjects:(id)topColor, (id)bottomColor, nil];

    [navigationBarShadow autorelease];


    [self.topItemHeaderView.layer addSublayer:navigationBarShadow];
}

所以它只是 bgHeader.png 没有出现。

在此处输入图像描述

4

1 回答 1

0

为什么要创建 UINavigationBar 的类别来设置背景图片?使用 UIAppearance API。

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navbar_image"] forBarMetrics:UIBarMetricsDefault];

或者,如果您只想为一个 UINavigationController 设置背景,请执行以下操作:

[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];

编辑 - -

由于该类别中使用了其他东西,我建议您改为子类 UINavigationBar,从而子类 UINavigationController 用子类 UINavigationBar 替换 navigationBar 属性。

或者,由于您无法将 ivars 添加到类别中,因此您必须创建一个属性。属性在 .h 方法中的工作方式相同,但在涉及类别时与 setter 和 getter 方法不同。

为了设置和获取类别中的属性,您必须实现objc_getAssociatedObject(), 和objc_setAssociatedObject().

@interface UINavigationBar (HomeBrokerNavigationBar) 

@property (nonatomic, retain) UIView * topItemHeaderView;

@end

static const void *TopItemHeaderViewKey = &TopItemHeaderViewKey;    
@implementation UINavigationBar (HomeBrokerNavigationBar)

@dynamic topItemHeaderView;

- (UIView *)topItemHeaderView {
    return objc_getAssociatedObject(self, TopItemHeaderViewKey);
}

- (void)setTopItemHeaderView:(UIView *) newHeader {
    objc_setAssociatedObject(self,TopItemHeaderViewKey, newHeader, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end
于 2013-01-11T22:55:51.540 回答