UIBlurEffect 在设备上不模糊但在模拟器中有效
UIBlurEffect not blurring on device but works in simulator
我正在尝试用 UIVisualEffectView
子视图创建一个 UIView
,效果是 UIBlurEffect
。视图在屏幕的一侧创建,然后使用动画滑入。
在模拟器上一切正常(我已经在 iPhone 4S 和 iPhone 6 上测试过)但是在我的 phone (iPhone 6)模糊只是不模糊,它看起来更像是 alpha
为 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 不模糊。
我不确定这是怎么回事,这让我觉得这与渲染帧有关,但我不是大师,所以如果有人有任何想法,我将不胜感激。
要结束这个,这是因为我在应用程序的大部分中使用 SpriteKit,因此使用 SKView 而不是 UIView。我意识到我没有在问题中提到这一点,但我不知道这会成为一个问题。显然 SKView 遵循不同的渲染路径,因此不会变得模糊,建议的方法是 effectnode。
in line blurView.frame = CGRectMake(0, 0, self.frame.width, self.frame.height)
in init method self.frame
can be zero before layoutSubviews.
当 self.frame 存在
时设置 blurView 框架
我正在尝试用 UIVisualEffectView
子视图创建一个 UIView
,效果是 UIBlurEffect
。视图在屏幕的一侧创建,然后使用动画滑入。
在模拟器上一切正常(我已经在 iPhone 4S 和 iPhone 6 上测试过)但是在我的 phone (iPhone 6)模糊只是不模糊,它看起来更像是 alpha
为 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 不模糊。
我不确定这是怎么回事,这让我觉得这与渲染帧有关,但我不是大师,所以如果有人有任何想法,我将不胜感激。
要结束这个,这是因为我在应用程序的大部分中使用 SpriteKit,因此使用 SKView 而不是 UIView。我意识到我没有在问题中提到这一点,但我不知道这会成为一个问题。显然 SKView 遵循不同的渲染路径,因此不会变得模糊,建议的方法是 effectnode。
in line blurView.frame = CGRectMake(0, 0, self.frame.width, self.frame.height)
in init method self.frame
can be zero before layoutSubviews.
当 self.frame 存在