ApplicationWillResignActive и setBrightness не работают?
Я использую [[UIScreen mainScreen] setBrightness:] (в sdk 5.0), чтобы изменить системный фоновой свет в моем приложении.
Следующие действия выполняются с моим приложением:
-
Включите приложение, установите яркость системы по умолчанию, затем сохраните как sysBright.
-
Измените яркость с помощью моего приложения, измените яркость, а затем сохраните как appBright.
-
Приложение ResignActive с кнопкой "home" или кнопкой блокировки, установите яркость в sysBright (значение шага 1, яркость системы по умолчанию).
-
Активное приложение снова. Затем он повторит описанные выше шаги с 1 по 3.
Что-то не так с шагом 3, когда я инактивирую приложение кнопкой блокировки, функция applicationWillResignActive работает хорошо, оно может восстановить значение яркости (sysBright).
Но когда я нажимаю кнопку "домой", это больше не работает. Яркость по-прежнему является значением, которое я изменил в своем приложении. (AppBright)
Кто-нибудь знает об этом? Спасибо за любую помощь ~
Вот код:
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];
}
Мне что-то не хватает?
Ответы
Ответ 1
Я ответил на аналогичный вопрос: IOS5 setBrightness не работает с applicationWillResignActive
iOS не предназначен для сохранения значений яркости в приложении. Он должен восстановить системное значение после того, как приложение уходит в отставку, завершает работу, аварийно завершает работу и т.д. Так что официально не нужно делать это в applicationWillResignActive.
Но это не работает. Это ошибка. На самом деле это работает, если вы пытаетесь переключиться на другое приложение. Попробуйте дважды нажать кнопку "Домой", и ваша яркость исчезнет.
Не тратьте свое время только на файл с сообщением об ошибке в Apple (я сделал хорошо).
Экран разблокировки восстанавливает яркость системы по умолчанию. Просто нажмите кнопку питания дважды и откройте, чтобы восстановить исходную яркость.
UPDATE:
Мой отчет об ошибке был закрыт, потому что, по словам Apple, это не ошибка. Это странно.
Ответ 2
Поскольку текущие методы не работают в методах делегата приложения, вы можете использовать UIView, как описано Адамом.
Сделайте UIView lvar в файле делегата h:
UIView *view_;
Тогда в реализации:
// 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;
При необходимости просмотрите размер экрана или контроллера. и убедитесь, что он поверх всех других объектов.
Помните, что это повлияет на производительность графики приложения, но если вы не делаете что-то сумасшедшее с пользовательским интерфейсом, все должно быть в порядке.
Ответ 3
Пробовали ли вы регистрировать свой главный контроллер вида (или какой-либо другой объект для него) для UIApplicationWillResignActiveNotification
, который отправляется после выполнения applicationWillResignActive
?
Это даст вам возможность изменить яркость вне applicationWillResignActive
. Не знаю, имеет ли этот метод какую-либо разницу, но попробовать это должно быть легко.
Просто позвоните:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResign) name:UIApplicationWillResignActiveNotification object:nil];
затем определите:
- (void)appWillResign {
[[NSUserDefaults standardUserDefaults] floatForKey:@"sysBright"];
[[UIScreen mainScreen] setBrightness:sysBright];
}
Ответ 4
При нажатии кнопки "домой" ваше приложение не уходит в отставку, а переходит в "Фоновый режим" и имеет свой собственный метод делегирования, который вам необходимо определить:
- (void)applicationDidEnterBackground:(UIApplication *)application
Что-то вроде этого (в дополнение к методу делегата applicationDidBecomeActive:
) должно получить предполагаемое поведение:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
sysBright = [[NSUserDefaults standardUserDefaults] floatForKey:@"sysBright"];
[[UIScreen mainScreen] setBrightness:sysBright];
}
Ответ 5
От второй до последней строки вы не назначили переменную sysBright.
sysBright = [[NSUserDefaults standardUserDefaults] floatForKey:@"sysBright"];
[[UIScreen mainScreen] setBrightness:sysBright];
Ответ 6
Вы вызвали синхронизацию?
[[NSUserDefaults standardUserDefaults] synchronize];