我为导航控制器根视图控制器和推送视图控制器都设置了背景图像,但是正如您在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/

10-13 00:59