0

なぜこれが機能しないのですか?UINavigationBarをサブクラス化したいので、xcodeで[新しいファイル]-> [Objective Cクラス]をクリックします。クラス:CustomNavBarサブクラス:UINavigationBar

次に、ナビゲーションコントローラーシーンの下のストーリーボードで、ナビゲーションバーをクリックし、そのクラスをCustomNavBarに設定します。

次に、CustomNaVBarクラスに移動し、カスタム画像の背景を追加しようとしました。

initWithFramメソッドで、これを追加しました。

- (id)initWithFrame:(CGRect)frame
{
    NSLog(@"Does it get here?"); //no
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        UIImage *image = [UIImage imageNamed:@"customNavBarImage.png"];
        //  [self setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
        [self setBackgroundColor:[UIColor colorWithPatternImage:image]];
        [[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
        NSLog(@"Does this get called?"); //no
    }
    return self;
}

コンソールに出力が表示されません。

代わりに、UINavBarをカスタマイズするためにこれを実行しましたが、サブレーザー処理ほど正しくないように感じます。最初のビューのviewDidLoadで、次の行を追加しました。

- (void)viewDidLoad
{
    [super viewDidLoad];
    if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) {
        UIImage *image = [UIImage imageNamed:@"customNavBarImage.png"];
        [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
    }
}
4

4 に答える 4

2

ライアン・ペリーに同意します。彼の答えに加えて:

このコードをに入れるのでinitWithFrameはなく、代わりにコードを入れてくださいawakeFromNib

- (void) awakeFromNib {
    // Initialization code
    UIImage *image = [UIImage imageNamed:@"customNavBarImage.png"];
    //  [self setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
    [self setBackgroundColor:[UIColor colorWithPatternImage:image]];
    [[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
    NSLog(@"Does this get called?"); //YES!!
}
于 2012-12-12T20:02:42.237 に答える
1

initWithFrameのドキュメントによると:

Interface Builderを使用してインターフェイスを設計する場合、ビューオブジェクトが後でnibファイルからロードされるときに、このメソッドは呼び出されません。nibファイル内のオブジェクトは再構成され、initWithCoder:メソッドを使用して初期化されます。このメソッドは、nibファイルに格納されている属性と一致するようにビューの属性を変更します。ビューがnibファイルからロードされる方法の詳細については、 『リソースプログラミングガイド』を参照してください。

http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html

これが、メソッドが期待どおりに呼び出されない理由です。

于 2012-12-12T19:49:51.743 に答える
1

initWithCoder:Storyboard から UI オブジェクトをロードするときに指定されたイニシャライザであるため、メソッドを使用する必要があります。したがって、次のコードを使用します。

- (id)initWithCoder:(NSCoder *)aDecoder
{
    NSLog(@"Does it get here?"); // now it does! 
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code
       // ...
        NSLog(@"Does this get called?"); // yep it does! 
    }
    return self;
}
于 2014-03-26T18:11:04.543 に答える
0

次のように UINavigation バーをサブクラス化できます。

@interface CustomNavigationBar : UINavigationBar

@end

@implementation CustomNavigationBar

- (void)drawRect:(CGRect)rect
{    
   //custom draw code
}

@end

//Begin of UINavigationBar background customization
@implementation UINavigationBar (CustomImage)

//for iOS 5 
+ (Class)class {
    return NSClassFromString(@"CustomNavigationBar");
}

@end
于 2012-12-12T20:05:50.577 に答える