2012-09-05 8 views
7

que labró un UIBarButtonItem usando API Apariencia como la siguienteApariencia API - UIBarButtonItem - MPMoviePlayerViewController y Youtube Webview

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

Esto funciona muy bien en toda la aplicación. El problema es que esto también cambia los botones en vistas de video de videos de YouTube que se cargan si hace clic en un video de YouTube en un uiwebview.

YouTube Examples

código de la adición de la siguiente manera:

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

no cambia nada (porque parece que la cosa YouTube no es sólo un MPMoviePlayerViewController

Si he entendido bien, yo. Tampoco puedo cambiar los botones de la vista de YouTube (y tampoco quiero esto).

Cualquier idea de cómo ¿Podría dejar de configurar imágenes de botón de barra personalizada en esta vista de video de YouTube?

Aquí es el proyecto de ejemplo, si usted quiere tomar una mirada más cercana: https://dl.dropbox.com/u/80699/BarItemsSample.zip

Respuesta

2

Creo que he llegado con la solución más eficaz actualmente disponible para este problema. Lamentablemente, el reproductor de video de Youtube es de una clase privada llamada MPInlineVideoViewController. No es posible usar el proxy de aparición en esta clase, que de todos modos sería un truco.

Esto es lo que se me ocurrió. Lo codifiqué de una manera que podría usarse en más de un lugar y también podría usarse para resolver otros problemas de proxy de Apariencia, como la parte posterior y los próximos UIBarButtonItems al completar un formulario en un UIWebView.

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]; 
} 

En el código anterior, alternamos los estilos de apariencia a sus valores predeterminados para que cuando se cargue el reproductor de YouTube, use los estilos predeterminados. El ViewController actual ya se ha cargado, por lo que tendrá la apariencia estilizada.

Cuando el reproductor de YouTube se cierra, el ViewController actual no se volverá a cargar, manteniendo así el estilo. Cuando desaparece el ViewController actual, las apariencias con estilo se vuelven a activar.

7

Debido a que no está entendiendo qué dosis de aparienciaWhenContainedIn: do.

El documento SDK dijo:

Para personalizar la apariencia de instancias de una clase cuando están contenidos dentro de una instancia de una clase de contenedor, o casos en una jerarquía, utiliza appearanceWhenContainedIn: para obtener la apariencia proxy para la clase.

El siguiente código dosifica lo que necesita en su pregunta. Pruébalo antes de preguntarme por favor.

Para iOS 5.x, debe hacer una subclase de UINavigationBar (sin ninguna anulación es necesario), por ejemplo

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

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

A continuación, debe editar el guión gráfico, deje que se utilice como MyNavigationBar barra de navegación de su UINavigationController.

Por último, puede utilizar el siguiente código para obtener lo que desea:

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

Para iOS 6, sólo puede utilizar el código de abajo:

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], [UINavigationController class], nil] setBackgroundImage:barButtonBgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
+0

por lo que parece esto está trabajando en ios6 sdk pero no en 5. – choise

+0

editado la respuesta, debería estar trabajando en iOS 5 ahora. – xuzhe

+0

en el futuro, sería bueno si redujo sus imágenes, antes de publicarlas. Poner imágenes de retina de tamaño completo en su tipo de respuesta aglutina a todo lo demás en la página. gracias por adelantado. – Nate

Cuestiones relacionadas