16

を使用している iPhone アプリケーションがありUINavigationController、カスタムの背景画像を使用して要素をカスタマイズしたいと考えています。UINavigationController's UINavigationBar以下のように、Objective-C カテゴリを使用して非常に簡単にこれを行うことができました。

http://foobarpig.com/iphone/uinavigationbar-with-solid-color-or-image-background.html

についても同じことをしたいのですUINavigationController's UIToolbarが、同じアプローチが機能していないようです(理由はまったくわかりませんが)。周りを見回したところ、サブクラス化を提案しているようですUIToolbarが、これは不可能ですUINavigationController's読み取り専用のツールバー用UIToolbarUINavigationController'sスライドインsetToolbarHiddenアニメーションを使用しているため、サブビュー ツールバーを作成するだけでなく、ツールバーを使用したいと考えています。

このツールバーに背景画像を適用できるかどうかは誰にも分かりますか(メソッドUINavigationControllerをオーバーライドすることで可能性が高い)。drawRect

4

4 に答える 4

10

アップデート:

UIAppearanceiOS 5.0 以降では、 を使用してナビゲーション バーをカスタマイズできるようになりました。


UINavigationBarこれを行う別の方法は、アプリケーションのクラスのカテゴリを単純に作成することです。これは非常に簡単に実装できました。

インターフェース:

@interface UINavigationBar (TENavigationBar)

- (void) drawRect:(CGRect)rect;

@end

実装:

@implementation UINavigationBar (TENavigationBar)

- (void) drawRect:(CGRect)rect
{
    UIImage *image = [UIImage imageNamed:@"navigation_background"];

    [image drawInRect:CGRectMake(0, 
                                 0, 
                                 self.frame.size.width, 
                                 self.frame.size.height)];
}

@end

次に、これはすべての に自動的にグローバルに適用されます。UINavigationBar

于 2010-10-31T18:52:25.230 に答える
9

カテゴリを作成する代わりにサブクラス化する必要があります。

カテゴリが機能するのに機能しない理由はよくわかりませんUINavigationBarUIToolbar、サブクラス化は両方で機能し、そのようなものをカスタマイズするより標準的な方法だと思います。

したがって、サブクラスUIToolbar化するには、というクラスMyToolbar(または同様のもの) を作成し、これを .h に入れます。

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface MyToolbar : UIToolbar {}

- (void)drawRect:(CGRect)rect;

@end

そして、これは.mファイルにあります:

#import "MyToolbar.h"

@implementation MyToolbar

- (void)drawRect:(CGRect)rect {
    backgroundImage = [UIImage imageNamed:@"my-awesome-toolbar-image.png"];
    [backgroundImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

@end

そこから、Navigation Controller にMyToolbarの代わりに使用するように指示する必要がありますUIToolbar。これを行う最も簡単な方法は、Interface Builder でナビゲーション コントローラーを選択し、属性インスペクターで [ツールバーを表示] ボックスをオンにすることです。ウィンドウにツールバーが表示されNavigationControllerます。それをクリックし、Identity Inspector でクラスを に変更しMyToolbarます。

于 2010-07-24T03:03:16.760 に答える
2

最良の解決策の1つは、UINavigationBarとUIToolbarのカテゴリを作成することです。次のクラスは、iOS4.0とiOS5.0の互換性のためのソリューションを提供します。

唯一のことは、viewDidLoadの次のメソッドを呼び出す必要があることです。例:

// Customizacion de navigation bar y toolbar compatible con iOS4 e iOS5
[UINavigationBar iOS5UINavigationBarBackgroundImage];
[UIToolbar iOS5UIToolbarBackgroundImage];    

したがって、iOS4.0とiOS5.0の互換性のクラスCategoryは、BackgroundImageの結果を次のようにカスタマイズします。

@implementation UINavigationBar (BackgroundImage)
- (void)drawRect:(CGRect)rect 
{    
    UIImage* img = [UIImage imageNamed: @"navigation-bg.png"];
    [img drawInRect: CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];  
    [self setTintColor:UIColorFromRGB(0x5ca666)];      
}
+ (void) iOS5UINavigationBarBackgroundImage
{
    if ([UINavigationBar respondsToSelector: @selector(appearance)])
    {
        [[UINavigationBar appearance] setBackgroundImage: [UIImage imageNamed: @"navigation-bg.png"] forBarMetrics: UIBarMetricsDefault];
        [[UINavigationBar appearance] setTintColor:UIColorFromRGB(0x5ca666)];
    }
}
@end

@implementation UIToolbar (BackgroundImage)
- (void)drawRect:(CGRect)rect 
{
    UIImage *image = [UIImage imageNamed: @"toolbar-bg.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    [self setTintColor:UIColorFromRGB(0x5ca666)];
}
+ (void) iOS5UIToolbarBackgroundImage
{
    if ([UIToolbar respondsToSelector: @selector(appearance)])
    {
        [[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed: @"toolbar-bg.png"] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
        [[UIToolbar appearance] setTintColor:UIColorFromRGB(0x5ca666)];
    }
}
@end

挨拶!

于 2012-06-08T10:28:47.553 に答える
0

簡単なオプションは、UINavigationBar/UIToolbar をサブクラス化し、次のメソッドを使用してナビゲーション コントローラーを初期化することです。

- (instancetype)initWithNavigationBarClass:(Class)navigationBarClass toolbarClass:(Class)toolbarClass

ただし、単純なカスタマイズ (背景画像、影など) の場合は、UIAppearanceプロトコル パターンを使用することをお勧めします。

于 2013-02-21T02:47:10.083 に答える