2012-09-05 8 views
7

ho designato un UIBarButtonItem utilizzando Aspetto API come la seguenteAspetto API - UIBarButtonItem - MPMoviePlayerViewController e Youtube Webview

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

Questa grande opera in tutto l'app. Il problema è che questo cambia anche i pulsanti nelle visualizzazioni video dei video di YouTube che vengono caricati se si fa clic su un video di YouTube in un uiwebview.

YouTube Examples

codice aggiungendo in questo modo:

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

non cambia nulla (perché sembra la cosa YouTube non è solo un MPMoviePlayerViewController

Se ho capito bene, io. Non sono inoltre autorizzato a cambiare i pulsanti della vista di YouTube (e anche io non lo voglio)

Qualche idea su come Potrei smettere di impostare le immagini dei pulsanti della barra personalizzata su questa visualizzazione video di YouTube?

Ecco il progetto di esempio, se si vuole dare uno sguardo più da vicino: https://dl.dropbox.com/u/80699/BarItemsSample.zip

risposta

2

Credo di aver messo a punto la soluzione più efficace attualmente disponibile per questo problema. Sfortunatamente il video player di YouTube è di una classe privata chiamata MPInlineVideoViewController. Non è possibile utilizzare il proxy dell'aspetto su questa classe, che sarebbe comunque una sorta di hack.

Ecco cosa mi è venuto in mente. L'ho codificato in modo che potesse essere usato in più di un posto e potrebbe anche essere usato per risolvere altri problemi con il proxy di Appearance, come il retro e il prossimo UIBarButtonItems durante la compilazione di un modulo in 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

Nel codice precedente riportiamo gli stili di aspetto ai valori predefiniti in modo che quando il player di YouTube viene caricato, utilizza gli stili predefiniti. Il ViewController corrente è già stato caricato in modo che abbia l'aspetto stilizzato.

Quando il player di YouTube chiude, il ViewController corrente non verrà ricaricato, mantenendo così lo stile. Quando il ViewController corrente scompare, le apparenze in stile vengono riaccese.

7

Perché si fraintendono quale aspetto della dose quando si tratti di: do.

Il documento SDK ha detto:

Per personalizzare le apparenze per le istanze di una classe se sono contenuti all'interno di un'istanza di una classe contenitore, o le istanze in una gerarchia, si utilizza appearanceWhenContainedIn: per ottenere l'aspetto proxy per la classe.

Il codice seguente consente di specificare ciò che si richiede nella propria domanda. Provalo prima che tu mi chieda per favore.

Per iOS 5.x, si dovrebbe fare una sottoclasse di UINavigationBar (senza alcuna esclusione necessario), per esempio

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

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

Poi si dovrebbe modificare lo storyboard, lasciarlo usare MyNavigationBar come barra di navigazione del suo UINavigationController.

Infine, è possibile utilizzare il codice sottostante per ottenere ciò che si vuole:

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

per iOS 6, si può semplicemente utilizzare il codice qui sotto:

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

così sembra questo funziona in ios6 SDK ma non in 5. – choise

+0

modificato la risposta, dovrebbe funzionare su iOS 5 ora. – xuzhe

+0

in futuro, sarebbe bello se ridimensionassi le tue immagini, prima di pubblicare. mettere immagini di retina di dimensioni normali nella tua risposta tipo folle di tutto il resto sulla pagina. Grazie in anticipo. – Nate