iOS 10中的UIVisualEffectView

Axo*_*ort 31 objective-c ios uivisualeffectview ios10 xcode8

我提出了一个包含UIVisualEffectView的UIViewController,如下所示:

-(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;
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在使用UIModalPresentationStyleOverFullScreen,以便当出现模糊的视图控制器时,模糊将"应用"到呈现它的视图控制器的内容; segue具有Cross Dissolve过渡风格.

效果看起来像预期的那样.但是,在iOS 9中,演示比iOS 10更流畅.在iOS 10中,当视图控制器出现时,它看起来像是两步动画,而在iOS 9中,模糊立即应用.

一张图片胜过千言万语所以我上传了一段显示这种奇怪行为的视频:

UIVisualEffectView iOS 9 vs iOS 10

我的问题是:如何在iOS 10中呈现iOS 10中的视图控制器?

Leo*_*ica 27

iOS 10已经改变了UIVisualEffectView它的工作方式,它打破了许多用例,这些用例并非严格意义上说是"合法的",而是之前的工作.坚持使用文档,你不应该消失UIVisualEffectView,这是你使用时发生的事情UIModalTransitionStyleCrossDissolve.它现在似乎在iOS 10上被破坏,同时屏蔽了视觉效果视图等等.

在你的情况下,我建议一个简单的修复,它也将创建比以前更好的效果,并在iOS 9和10都支持.创建一个自定义的演示文稿,而不是淡入视图,动画effect属性动画nil到模糊效果.如果需要,您可以淡入视图层次结构的其余部分.这样可以巧妙地为模糊半径设置动画,类似于向下拉主屏幕图标时的模糊半径.

  • 真棒!效果很好.我使用了与我发布的视频相同的项目,并使用您的解决方案将其上传到GitHub.谢谢.> https://github.com/Axort/BlurTest-iOS10 (3认同)
  • 谢谢你.它的工作方式与广告一样.请注意,您必须先将视觉效果视图的效果属性设置为nil.然后你动画到你的目标"效果".(例如光).并且您无法设置视觉效果视图或任何超级视图的alpha.(这在iOS 9中是有效的,在iOS 10中完全没有.)Apple为您带来了另一个优秀的API.我只能感谢Stack Overflow及其贡献者...... (3认同)

小智 5

    UIView.animate(withDuration: 0.5) {
        self.effectView.effect = UIBlurEffect(style: .light)
    }
Run Code Online (Sandbox Code Playgroud)

在iOS9和10上都经过测试.对我来说很好