透明视图是黑色的?



我正在尝试创建一个在某些位置透明的视图,以查看后面的图像。 但是,由于某种原因,在视图的透明部分,我看到的是黑色,而不是视图后面的内容。 我已经将其精简为很少的代码,并且不明白为什么我的透明视图显示黑色而不是红色(后面视图的颜色(。 这是我的代码:

class ViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let redView = UIView(frame: view.frame)
redView.backgroundColor = UIColor.red
let transparentView = TransparentView(frame: view.frame)
view.addSubview(redView)
view.addSubview(transparentView)
}
}

class TransparentView: UIView {
override func draw(_ rect: CGRect) {
UIColor.clear.setFill()
UIRectFill(rect)
}

我希望屏幕是全红色的,但它显示全黑。 在有人说制作清晰视图要容易得多之前,我实际上正在尝试在drawRect中做更复杂的事情,只是下降到最基本的事情来尝试调试我的问题。 我在这里错过了什么?

使用self.isOpaque = false;使视图/图层透明,即使drawRect被覆盖也是如此。

class TransparentView: UIView {
override init(frame: CGRect) {
super.init(frame: frame);
self.isOpaque = false;  //Use this..
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func draw(_ rect: CGRect) {
UIColor.clear.setFill()
UIRectFill(rect)
}
}

我想通了。 显然,即使您覆盖draw,背景颜色似乎仍然被考虑,并且默认为黑色。 我将以下内容添加到我的透明视图类中:

override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.clear
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

"drawRect:如果您的视图绘制自定义内容,则实现此方法。如果您的视图不执行任何自定义绘图,请避免覆盖此方法。链接

话虽如此,正如您所说,只需在 Init 上设置背景颜色就会更好。

override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.clear
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

就个人而言,我不会为如此少的自定义而细分视图。只需在创建时设置它。此外,视图设置在viewDidLoad上更好,而不是在viewWillAppear中。因为它将在每次您的视图进入前台时执行,并且您将以添加两个透明视图结束。 此外,将这些行保留在具有私有函数的扩展中有助于保持代码清晰。

class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
}
}

//MARK: - Private Methods
extension ViewController{
fileprivate func setupViews(){
let redView = UIView(frame: view.frame)
redView.backgroundColor = UIColor.red
view.addSubview(redView)
let transparentView = UIView(frame: view.frame)
transparentView.backgroundColor = UIColor.clear
view.addSubview(transparentView)
}
}

请注意,更明确的方法是在情节提要中创建这些视图(而不是通过代码(。保持代码清晰,更容易理解并查看正在发生的事情。

最新更新