7

UIBarButtonItem次のように Appearance API を使用してスタイルを設定しました

[[UIBarButtonItem appearance] setBackgroundImage:barButtonBgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

これは、アプリ全体でうまく機能します。問題は、uiwebview.

YouTube の例

次のようなコードを追加します。

[[UIBarButtonItem appearanceWhenContainedIn:[MPMoviePlayerViewController class], nil] setBackgroundImage:barButtonBgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

何も変更しません (YouTube のことは単なるMPMoviePlayerViewController.

私が正しく理解していれば、YouTube ビューのボタンを変更することも許可されていません (また、これは望ましくありません)。

この YouTube ビデオ ビューでカスタム バー ボタン イメージの設定を停止する方法はありますか?

詳細を確認したい場合は、サンプル プロジェクトを次に示します: https://dl.dropbox.com/u/80699/BarItemsSample.zip

4

2 に答える 2

7

あなたはどのような用量の外観を誤解しているためです。

SDK ドキュメントには次のように記載されています。

クラスのインスタンスがコンテナ クラスのインスタンス内に含まれている場合、または階層内のインスタンスの外観をカスタマイズするには、appearanceWhenContainedIn: を使用して、クラスの外観プロキシを取得します。

以下のコードは、質問で必要なものを示しています。私に質問する前に試してみてください。

iOS 5.x の場合、UINavigationBar のサブクラスを作成する必要があります (オーバーライドは必要ありません)。たとえば、

//In MJAppDelegate.h:
@interface MyNavigationBar : UINavigationBar
@end

//In MJAppDelegate.m:
@implementation MyNavigationBar
@end

次に、ストーリーボードを編集して、MyNavigationBar を UINavigationController のナビゲーション バーとして使用できるようにします。

最後に、以下のコードを使用して、必要なものを取得できます。

[[UIBarButtonItem  appearanceWhenContainedIn:[MyNavigationBar class], nil] setBackgroundImage:barButtonBgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

iOS 6 の場合は、次のコードを使用できます。

[[UIBarButtonItem  appearanceWhenContainedIn:[UINavigationBar class], [UINavigationController class], nil] setBackgroundImage:barButtonBgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
于 2012-09-15T01:52:45.883 に答える
2

私は、この問題に対して現在利用可能な最も効率的な解決策を考え出したと信じています。残念ながら、Youtubeビデオプレーヤーはと呼ばれるプライベートクラスのものMPInlineVideoViewControllerです。このクラスで外観プロキシを使用することはできません。これはとにかくハックのようなものです。

これが私が思いついたものです。複数の場所で使用できるようにコーディングしました。また、UIWebViewでフォームに入力するときに、戻るUIBarButtonItemsや次のUIBarButtonItemsなどの他の外観プロキシの問題を解決するためにも使用できます。

AppDelegate.h

extern NSString * const ToggleAppearanceStyles;

AppDelegate.m

NSString * const ToggleAppearanceStyles = @"ToggleAppearanceStyles";

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    NSNotification *note = [NSNotification notificationWithName:ToggleAppearanceStyles object:NULL userInfo:@{@"flag" : @(YES)}];
    [self toggleAppearanceStyles:note];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(toggleAppearanceStyles:) name:ToggleAppearanceStyles object:NULL];

    return YES;
}
-(void)toggleAppearanceStyles:(NSNotification *)note {

    UIImage *barButtonBgImage = nil;
    UIImage *barButtonBgImageActive = nil;

 if([note.userInfo[@"flag"] boolValue]) {

        barButtonBgImage = [[UIImage imageNamed:@"g_barbutton.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 4, 15, 4)];
        barButtonBgImageActive = [[UIImage imageNamed:@"g_barbutton_active.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 4, 15, 4)];
    }

    [[UIBarButtonItem appearance] setBackgroundImage:barButtonBgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    [[UIBarButtonItem appearance] setBackgroundImage:barButtonBgImageActive forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];

}

MJWebViewController.m

-(void)viewDidAppear:(BOOL)animated {

    [[NSNotificationCenter defaultCenter] postNotificationName:ToggleAppearanceStyles object:NULL userInfo:@{@"flag" : @(NO)}];

    [super viewDidAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] postNotificationName:ToggleAppearanceStyles object:NULL userInfo:@{@"flag" : @(YES)}];

    [super viewWillDisappear:animated];
}

上記のコードでは、外観スタイルをデフォルト値に戻すため、YouTubeプレーヤーが読み込まれると、デフォルトのスタイルが使用されます。現在のViewControllerはすでにロードされているため、スタイル付きの外観になります。

YouTubeプレーヤーを閉じると、現在のViewControllerはリロードされないため、スタイルが維持されます。現在のViewControllerが消えると、スタイル設定された外観が再びオンになります。

于 2012-09-15T01:37:58.547 に答える