UIVisualEffectView в iOS 10

Я представляю UIViewController, который содержит UIVisualEffectView следующим образом:

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"segueBlur" sender:nil]; } -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if([segue.identifier isEqualToString:@"segueBlur"]) { ((UIViewController *)segue.destinationViewController).providesPresentationContextTransitionStyle = YES; ((UIViewController *)segue.destinationViewController).definesPresentationContext = YES; ((UIViewController *)segue.destinationViewController).modalPresentationStyle = UIModalPresentationOverFullScreen; } } 

Как вы можете видеть, я использую UIModalPresentationStyleOverFullScreen, так что, когда появляется контроллер вида с размытием, размытие будет «применено» к содержимому контроллера представления, который его представляет; у segue есть стиль перехода Cross Dissolve.

Эффект выглядит так, как ожидалось. Однако в iOS 9 презентация более плавная, чем в iOS 10. В iOS 10, когда появляется контроллер просмотра, кажется, что это двухэтапная анимация, тогда как в iOS 9 размытие применяется немедленно.

Изображение стоит тысячи слов, поэтому я загрузил видео, показывающее это странное поведение:

UIVisualEffectView iOS 9 vs iOS 10

Мой вопрос: как я могу представить контроллер представления в iOS 10, поскольку он представлен в iOS 9?

3 Solutions collect form web for “UIVisualEffectView в iOS 10”

iOS 10 изменил способ работы UIVisualEffectView , и он нарушил многие варианты использования, которые не были строго «законными», но работали до этого. Придерживаясь документации, вы не должны UIVisualEffectView в UIVisualEffectView , что происходит, когда вы используете UIModalTransitionStyleCrossDissolve . Кажется, теперь он сломан на iOS 10, а также маскирует визуальные эффекты и другие.

В вашем случае я бы предложил простое исправление, которое также создаст лучший эффект, чем раньше, и будет поддерживаться как для iOS 9, так и для 10. Создайте собственную презентацию и вместо того, чтобы затухать представление в, оживить свойство effect от nil до эффект размытия. При необходимости вы можете погрязнуть в остальной иерархии вашего представления. Это будет аккуратно анимировать радиус размытия, похожий на то, как он выглядит, когда вы вытаскиваете значки на главном экране.

  UIView.animate(withDuration: 0.5) { self.effectView.effect = UIBlurEffect(style: .light) } 

Протестировано как на iOS9, так и на 10. Работает отлично для меня

Код ниже размытия контроллера родительского представления при представлении ViewController. Протестировано как на iOS9, так и на 10.

 @interface ViewController () <UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning> @property (nonatomic) UIVisualEffectView *blurView; @end @implementation ViewController - (instancetype)init { self = [super init]; if (!self) return nil; self.modalPresentationStyle = UIModalPresentationOverCurrentContext; self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; self.transitioningDelegate = self; return self; } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor clearColor]; self.blurView = [UIVisualEffectView new]; [self.view addSubview:self.blurView]; self.blurView.frame = self.view.bounds; } - (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source { return self; } -(NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext { return 0.3; } -(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { UIView *container = [transitionContext containerView]; [container addSubview:self.view]; self.blurView.effect = nil; [UIView animateWithDuration:0.3 animations:^{ self.blurView.effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]; } completion:^(BOOL finished) { [transitionContext completeTransition:finished]; }]; } @end 
  • Xcode 8 со смешанным проектом Swift и Objective-c сгенерированный заголовок «ModuleName-Swift.h» не найден
  • Метод didSelectRowAtIndexPath никогда не вызывал устройства iOS 10
  • URLSessionUploadTask автоматически отменяется
  • Как установить размер UIScrollView?
  • Трэвис не запускает симулятор на xcode8
  • Включение контейнера внутри рамки: файл не найден
  • Странные сообщения терминала в Xcode 8
  • Xcode 8: Тип 'UserDefaults' не имеет стандартного члена '
  • Отладчик Xcode 8 не печатает объекты и показывает выраженную ошибку
  • Запуск 1 из 2 пользовательских сценариев оболочки застрял в течение 2 минут в Xcode
  • Xcode 8 Проблема: рамка для «панели навигации» будет отличаться во время выполнения
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.