Эффект размытия перестал работать в iOS 11

Я использовал следующий код для создания blur effect, и он отлично работал на iOS 10, но перестал работать на iOS 11. Я не могу просмотреть blur, когда приложение перемещается на background. Когда приложение переходит на foreground, иногда blur stays always и приложение больше не работает, единственный способ заставить его работать — это relaunching приложение.

Есть ли обходной путь для iOS 11?

-(void)addBlurEffect{
    UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
    UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    blurEffectView.frame = window.frame;
    blurEffectView.tag = 4444;
    [window addSubview:blurEffectView];

}

-(void)removeBlurEffect{
    NSArray *allWindows = [[UIApplication sharedApplication] windows];
    for (UIWindow * aWindow in allWindows) {
        UIView *blurEffectView = [aWindow viewWithTag:4444];
        if (blurEffectView){
            [blurEffectView removeFromSuperview];
        }
    }
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    [self addBlurEffect];
}


- (void)applicationWillEnterForeground:(UIApplication *)application {
    [self removeBlurEffect];
}

person Ram    schedule 19.11.2017    source источник
comment
Какой смысл добавлять эффект размытия, когда приложение находится в фоновом режиме? Приложение не работает в фоновом режиме; там нечего смотреть. Что этот код пытается сделать?   -  person matt    schedule 19.11.2017
comment
если вы хотите, чтобы ваше приложение ничего не отображало в фоновом режиме из соображений безопасности, вы можете добавить представление сверху, скрывающее экран вашего приложения.   -  person Ellen    schedule 19.11.2017


Ответы (1)


Это происходит потому, что вы все время делаете это с НЕПРАВИЛЬНЫМИ делегатами. Вам нужно прочитать документацию или комментарии в AppDelegate о том, что делает каждый метод.

- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.

    [self addBlurEffect];
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

    [self removeBlurEffect];
}

Так что думайте о двух вышеприведенных методах как о «приостановке» или «возобновлении паузы» в игре. Когда игра переходит в фоновый режим или прерывается, обычно вы приостанавливаете ее для пользователя, чтобы он не потерял прогресс, не умер или что-то еще, пока она идет. в фоновом или переходном состоянии (IE: состояние диспетчера задач).

Затем, когда они возобновляются и приложение отображается на экране, вы возобновляете его работу. Это потребует обновления и аннулирования графики. Что обрабатывают два вышеуказанных метода..

Однако вы делали это в:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

Этот метод предназначен для сохранения состояний и очистки.. без изменения пользовательского интерфейса.. IE: хранение данных в базе данных или синхронизация пользовательских настроек с диском или что-то еще, или освобождение памяти.. Пользователь потенциально может убить приложение в этом состоянии, или система может убей и его.

Это вызывается только тогда, когда приложение фактически свернуто (свернутое/фоновое состояние НЕ совпадает с состоянием переключателя задач/активным состоянием!). В iOS 11 переход другой, так что теперь мы действительно видим разницу, я думаю..

Если вы переместите свой код в обработчики активного состояния, он будет работать на 100% нормально.

person Brandon    schedule 19.11.2017
comment
Как вы сказали, в iOS 11 есть другой стиль перехода, иногда эффект размытия не добавляется. Любая идея, почему эти методы делегата не вызываются при двойном нажатии на домашнюю кнопку устройства? - person Suresh Durishetti; 08.02.2018