2011-11-29 15 views
27

Io uso [[UIScreen mainScreen] setBrightness:] (in sdk 5.0) per cambiare la luce dello sfondo del sistema nella mia app.applicationWillResignActive e setBrightness non funzionano?

Le seguenti operazioni funzionano con la mia app:

  1. attiva l'app, ottenere la luminosità del sistema di default, quindi salvare come sysBright.

  2. Modificare la luminosità con la mia app, modificare la luminosità, quindi salvare come appBright.

  3. ResignActive app con pulsante home o pulsante di blocco, imposta la luminosità su sysBright (valore passo 1, luminosità predefinita del sistema).

  4. App attiva di nuovo. Allora sarà ripetere i passaggi sopra modulo 1 a 3.

qualcosa è sbagliato con il passaggio 3, quando inattivano l'applicazione con il pulsante di blocco, la funzione applicationWillResignActive funziona bene, può ripristinare il valore di luminosità (sysBright).

Ma quando premo il tasto home, non funziona più. La luminosità è ancora il valore che ho cambiato nella mia app. (appBright)

Qualcuno ha qualche idea al riguardo? Grazie per qualsiasi aiuto ~

Ecco il codice:

float appBright,sysBright; 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    sysBright = [[UIScreen mainScreen] brightness]; 
    [[NSUserDefaults standardUserDefaults] setFloat:sysBright forKey:@"sysBright"]; 

    [[UIScreen mainScreen] setBrightness:appBright]; 
} 

//doesn't work when i ResignActive with the home button 
- (void)applicationWillResignActive:(UIApplication *)application 
{   
    [[NSUserDefaults standardUserDefaults] floatForKey:@"sysBright"]; 
    [[UIScreen mainScreen] setBrightness:sysBright];   
} 

mi sto perdendo qualcosa?

+0

Avete trovato qualche soluzione? Ho incontrato lo stesso problema. Il valore di luminosità nelle impostazioni non è influenzato affatto. –

+0

Ho bisogno della stessa cosa, per favore condividi la tua soluzione se hai qualcosa. Grazie – Mangesh

+1

Finito andando con un UIView semi-trasparente nero e facendo uso dell'API di prossimità –

risposta

0

Quando si tocca il tasto Home la vostra applicazione non si dimette attivo, ma piuttosto va in "modalità sfondo" e ha il suo metodo delegato che è necessario definire:

- (void)applicationDidEnterBackground:(UIApplication *)application 

Qualcosa di simile (in aggiunta al metodo applicationDidBecomeActive: delegato) dovrebbe ottenere il comportamento desiderato:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{   
    sysBright = [[NSUserDefaults standardUserDefaults] floatForKey:@"sysBright"]; 
    [[UIScreen mainScreen] setBrightness:sysBright]; 
} 
+0

Grazie per il suggerimento, ma ancora non funziona ... ho provato: - (void) applicationDidEnterBackground: (UIApplication *) applicazione { NSLog (@ "L'applicazione è In esecuzione in background "); // Ripristina luminosità su normale [[Schermata principale UIScreen] setBrightness: sysBright]; } ' e NSLogs il commento su di me premendo il pulsante Home ma non modifica la luminosità ?! –

+0

Non sono sicuro del resto del programma, ma probabilmente dovresti recuperare la variabile sysBright dai valori predefiniti dell'utente. Vedere il mio codice aggiornato nella mia risposta originale –

+2

Provato il tuo nuovo suggerimento ma ancora senza fortuna. Posso NSLog il valore corretto di sysBright nel metodo applicationDidEnterBackground ma semplicemente non cambierà effettivamente la luminosità. La luminosità cambia in applicationWillEnterForeground quando apro il backup dell'app utilizzando lo stesso codice! molto confuso! –

0

penultima riga, non è stato assegnato alla variabile sysBright.

sysBright = [[NSUserDefaults standardUserDefaults] floatForKey:@"sysBright"]; 
[[UIScreen mainScreen] setBrightness:sysBright];   
+0

Grazie per il suggerimento ma non funziona ancora –

+0

Penso che sia impossibile farlo fin da ora, ma ho fatto una ridicola soluzione alternativa a un ImageView impostato come un rettangolo nero con opacità 0.9. Funziona come un incantesimo se sono onesto, frustrando semplicemente che ho perso così tanto tempo senza trovare una soluzione che coinvolge [UIScreen setBrightness]; –

+0

L'ho appena provato nella mia app, funziona benissimo. Assicurati che il valore di luminosità sia compreso tra 0 e 1 ed è un valore float. – Tim

1

Dal momento che i metodi attuali non funzionano nei metodi app delegato, è possibile utilizzare un UIView come descritto da Adam.

Fai un lvar UIView nel file delegato h:

UIView *view_; 

Poi nella realizzazione:

// create view in app delegate didFinishLaunchingWithOptions method and add it to the window 
view_ = [[UIView alloc] initWithFrame:self.window.frame]; // delegate lvar 
[view_ setBackgroundColor:[UIColor blackColor]]; 
[view_ setAlpha:0.5]; 
[self.window addSubview:view_]; 
[self.window makeKeyAndVisible]; 
return YES; 

Fai la vista delle dimensioni del vostro schermo o vista del regolatore, se necessario. e assicurati che sia in cima a tutte le altre sottoview.

Ricorda che questo avrà un impatto significativo sulle prestazioni grafiche dell'app, ma a meno che tu non stia facendo qualcosa di pazzesco con l'interfaccia utente, dovrebbe andar bene.

+0

Sì, l'ho già preso dai suoi commenti, ma non voglio farlo in quel modo. Faresti meglio a farlo come una nuova finestra a livello di barra di stato che come una sottoview, altrimenti probabilmente dovresti continuare a spostarlo in prima fila tutto il tempo! – jrturton

+0

È un trucco, lo so, ma funziona per le mie app. Spero che ci sarà una soluzione per il futuro. – TigerCoding

+0

Questo non aiuta la mia situazione, sto riducendo la retroilluminazione per ridurre l'utilizzo della batteria. – progrmr

1

Avete provato a registrare il controller di visualizzazione principale (o qualsiasi altro oggetto) per lo UIApplicationWillResignActiveNotification che viene inviato dopo l'esecuzione di applicationWillResignActive?

Questo vi darà la possibilità di modificare la luminosità all'esterno di applicationWillResignActive. Non so se questo metodo fa alcuna differenza, ma provarlo dovrebbe essere facile.

Chiamate:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResign) name:UIApplicationWillResignActiveNotification object:nil]; 

quindi definire:

- (void)appWillResign { 
    [[NSUserDefaults standardUserDefaults] floatForKey:@"sysBright"]; 
    [[UIScreen mainScreen] setBrightness:sysBright];   
} 
+0

Buona idea, ma no, stesso risultato. Sto iniziando a pensare che la risposta sia solo per presentare un bug. Intendo davvero, i cambiamenti di luminosità in-app non dovrebbero nemmeno essere in grado di influenzare l'intero dispositivo - o forse no. iBooks ha lo stesso problema. Cambiando la luminosità in c'è un'impostazione globale. – jrturton

10

ho risposto a una domanda simile qui: IOS5 setBrightness didn't work with applicationWillResignActive

iOS non è destinato a mantenere in-app valori di luminosità. Dovrebbe ripristinare il valore di sistema dopo che l'app si dimette attiva, si chiude, si arresta in modo anomalo, ecc. Quindi ufficialmente non è necessario farlo in applicationWillResignActive.

Ma non funziona. È un errore. In effetti funziona se si tenta di passare a un'altra app. Prova a premere il pulsante Home due volte e la luminosità è sparita.

Non perdere tempo semplicemente Segnala un bug report a Apple (ho fatto bene).

Unlock screen ripristina la luminosità predefinita del sistema. Basta premere due volte il pulsante di accensione e sbloccare per ripristinare la luminosità originale.

UPDATE: Il mio bug report era chiuso perché secondo Apple non è un bug. È strano.

+1

https://devforums.apple.com/thread/139813?start=0&tstart=0 –

+0

Segnala un bug. La priorità di Apple li risolve in base al numero di duplicati. Aiuta anche a spiegare come la correzione migliorerà l'esperienza dell'utente. Ho intenzione di archiviarlo di nuovo anche se il tuo è stato chiuso. – progrmr

+1

Risolto in iOS 8! – jjxtra

-1

hai chiamato sincronizzazione?

[[NSUserDefaults standardUserDefaults] synchronize]; 
+0

yeh, non è quello –