我为导航控制器根视图控制器和推送视图控制器都设置了背景图像,但是正如您在gif中看到的那样,当推送和弹出时,会有一个奇怪的垂直矩形区域,动画有点滞后。
private var isCustomBackgroundOn:Bool {
set {
if newValue {
if let imageData = try? Data(contentsOf: Constants.homeVCBackgroundImageURL) {
backgroundImageView.image = UIImage(data: imageData)
} else {
backgroundImageView.image = nil
self.isCustomBackgroundOn = false
self.isBlurEffectOn = false
}
} else{
self.isBlurEffectOn = false
backgroundImageView.image = nil
}
}
get {
if let isOn = Constants.defaults.value(forKey: Constants.isCustomBackgroundOnKey) as? Bool {
return isOn
} else {
return false
}
}
}
lazy var backgroundImageView:UIImageView = {
let v = UIImageView()
v.contentMode = UIView.ContentMode.scaleAspectFill
// 如果document文件夹有图片的话,加载图片
let url = Constants.homeVCBackgroundImageURL
// 只有当用户打开自定义背景图开关,才从Document文件夹尝试加载图片
if self.isCustomBackgroundOn {
if let imageData = try? Data(contentsOf: url) {
v.image = UIImage(data: imageData)
}
}
v.frame = self.view.bounds
return v
}()
private var isBlurEffectOn:Bool {
set {
Constants.defaults.setValue(newValue, forKey: Constants.isBlurOnKey)
}
get {
if let isOn = Constants.defaults.value(forKey: Constants.isBlurOnKey) as? Bool {
return isOn
} else {
return false
}
}
}
private var vibrancyEffectView = UIVisualEffectView()
lazy var blurView:UIVisualEffectView = {
// 先创建第一层的UIVisualEffectView(用blur效果)
let blurEffect = UIBlurEffect(style: .light)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = UIScreen.main.bounds
// 再创建第二层的UIVisualEffectView(用使用第一层blur效果创建的vibrancy效果)
let vibrancyEffect = UIVibrancyEffect(blurEffect: blurEffect)
self.vibrancyEffectView = UIVisualEffectView(effect: vibrancyEffect)
self.vibrancyEffectView.frame = UIScreen.main.bounds
return blurEffectView
}()
private func setBackGroundView() {
// 只有用户设置了背景图,才将模糊视图添加到主界面
self.vibrancyEffectView.removeFromSuperview()
self.blurView.removeFromSuperview()
self.backgroundImageView.removeFromSuperview()
if self.backgroundImageView.image != nil {
if isBlurEffectOn {
// 将第二层UIVisualEffectView添加到第一层的contentView中
self.view.insertSubview(self.blurView, belowSubview: self.tableView)
// 加载背景图
self.view.insertSubview(self.backgroundImageView, belowSubview: self.blurView)
} else {
// 加载背景图
self.view.insertSubview(self.backgroundImageView, belowSubview: self.tableView)
}
}
}
这些是推送的ViewController的代码。 setBackgroundView在其viewDidLoad中调用。从上到下主要有三个视图,一个是将backgroundColor设置为clear的表视图,一个是默认的UIVisualEffectView,一个UIImageView用作背景图像。
最佳答案
只需剪切您的图像:backgroundImageView.clipsToBounds = true
关于ios - 如何在推和弹出时删除奇怪的垂直矩形区域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57847328/