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

因为你误会了appearanceWhenContainedIn: do。

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。

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 回答