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のカテゴリを作成するのはなぜですか?UIAppearanceAPIを使用します。

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

または、1つのUINavigationControllerの背景を設定するだけの場合は、次の手順を実行します。

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

編集 - -

このカテゴリでは他のものが使用されているため、代わりにUINavigationBarをサブクラス化し、ナビゲーションバープロパティをサブクラスUINavigationBarに置き換えてUINavigationControllerをサブクラス化することをお勧めします。

または、ivarをカテゴリに追加できないため、プロパティを作成する必要があります。プロパティは.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 に答える