UIBlurEffect 在设备上不模糊但在模拟器中工作

Posted

技术标签:

【中文标题】UIBlurEffect 在设备上不模糊但在模拟器中工作【英文标题】:UIBlurEffect not blurring on device but works in simulator 【发布时间】:2015-01-28 21:09:34 【问题描述】:

我正在尝试制作带有 UIVisualEffectView 子视图的 UIViewUIBlurEffect 作为效果。视图是在屏幕一侧创建的,然后使用动画滑入。

在模拟器上一切正常(我在 iPhone 4S 和 iPhone 6 上测试过),但在我的手机(iPhone 6)上,模糊并没有模糊,它看起来更像是带有@的深灰色987654325@ 0.5。此外,当我截取设备的屏幕截图或从主屏幕打开它时,会在再次开始一致渲染之前为该单帧渲染模糊。

这是当前视图的屏幕截图:

但是在设备上不存在模糊,它本质上只是一个黑暗、透明的视图。

这是我用来初始化视图的代码,blurViewvibrancyView 属性被声明为全局变量:

init(left: Bool)
    self.left = left
    let screenSize = UIScreen.mainScreen().bounds.size

    var rect: CGRect
    if left
        rect = CGRectMake(-screenSize.width*0.3, 0, screenSize.width*0.3, screenSize.height)
    else
        rect = CGRectMake(screenSize.width, 0, screenSize.width*0.3, screenSize.height)
    

    super.init(frame: rect)
    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark)
    blurView = UIVisualEffectView(effect: blurEffect)
    blurView.frame = CGRectMake(0, 0, self.frame.width, self.frame.height)
    self.addSubview(blurView)
    let vibrancy = UIVibrancyEffect(forBlurEffect: blurEffect)
    vibrancyView = UIVisualEffectView(effect: vibrancy)
    vibrancyView.frame = blurView.frame
    blurView.addSubview(vibrancyView)

    self.userInteractionEnabled = true

并将包含 blurView 的 superView 移动到:

func moveIn()
    UIView.animateWithDuration(0.3, animations:  () -> Void in
        var center = self.center
        if self.left
            center.x = UIScreen.mainScreen().bounds.size.width*0.15
        else
            center.x = UIScreen.mainScreen().bounds.size.width*0.85
        
        self.center = center
    )

正如我之前所说的动画和这样的作品很好,但 blurView 不模糊。

我不确定这是怎么回事,这让我觉得这与渲染帧有关,但我不是专家,所以如果有人有任何想法,我将不胜感激。

【问题讨论】:

【参考方案1】:

要解决这个问题,这是因为我在大多数应用程序中都使用 SpriteKit,因此使用的是 SKView 而不是 UIView。我意识到我没有在问题中提到这一点,但我不知道这将是一个问题。显然 SKView 遵循不同的渲染路径,因此不会变得模糊,建议的方法是 effectnode。

【讨论】:

你有解释这个的链接吗?自己解决这个问题。 没有直接来自 Apple,我刚刚看到 Cocos2D 对另一个类似问题的评论,谈论 SKViews 的渲染路径以及它与您的基本 UIView 有何不同,我所看到的一切似乎都支持这一点想法。坦率地说,我仍在寻找某种带有屏幕截图和各种模糊技术的解决方法,但没有什么能真正接近。我很想看看苹果是否有什么要说的。 实际上,我可以使用 UIVisualEffectView 来模糊设备上的 SKView。它只是对我的视图层次结构进行了一些重组。当我的 SKView 和 UIVisualEffectView 都是同一个 UIView 容器的直接子视图时,它起作用了。【参考方案2】:

init 方法中的blurView.frame = CGRectMake(0, 0, self.frame.width, self.frame.height) 行中的self.frame 在layoutSubviews 之前可以为零。 当self.frame存在时设置blurView帧

【讨论】:

以上是关于UIBlurEffect 在设备上不模糊但在模拟器中工作的主要内容,如果未能解决你的问题,请参考以下文章

C# 推送通知在模拟器上工作但在真实设备上不工作

android套接字在模拟器上工作,但在我的真实设备上不工作

Firebase setValue() 在模拟器上工作,但在设备上不工作,有人知道为啥吗? iOS 10,斯威夫特 3.1

iOS applink 在设备上不起作用,但在模拟器上打开应用程序

应用程序的文件在模拟器的“文件”应用程序中可见,但在设备上不可见

IOS 上的 mvvmcross 绑定问题(适用于模拟器,但某些属性在设备上不起作用)