UIBlurEffect 在设备上不模糊但在模拟器中工作
Posted
技术标签:
【中文标题】UIBlurEffect 在设备上不模糊但在模拟器中工作【英文标题】:UIBlurEffect not blurring on device but works in simulator 【发布时间】:2015-01-28 21:09:34 【问题描述】:我正在尝试制作带有 UIVisualEffectView
子视图的 UIView
和 UIBlurEffect
作为效果。视图是在屏幕一侧创建的,然后使用动画滑入。
在模拟器上一切正常(我在 iPhone 4S 和 iPhone 6 上测试过),但在我的手机(iPhone 6)上,模糊并没有模糊,它看起来更像是带有@的深灰色987654325@ 0.5。此外,当我截取设备的屏幕截图或从主屏幕打开它时,会在再次开始一致渲染之前为该单帧渲染模糊。
这是当前视图的屏幕截图:
但是在设备上不存在模糊,它本质上只是一个黑暗、透明的视图。
这是我用来初始化视图的代码,blurView
和 vibrancyView
属性被声明为全局变量:
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 在设备上不模糊但在模拟器中工作的主要内容,如果未能解决你的问题,请参考以下文章
android套接字在模拟器上工作,但在我的真实设备上不工作
Firebase setValue() 在模拟器上工作,但在设备上不工作,有人知道为啥吗? iOS 10,斯威夫特 3.1
iOS applink 在设备上不起作用,但在模拟器上打开应用程序