我正在尝试创建一个在某些位置透明的视图,以查看背后的图像。但是,出于某种原因,在视图的透明部分,我看到的是黑色,而不是视图背后的内容。我把它修剪成很少的代码并且不明白为什么我的透明视图显示黑色而不是红色(后面的视图的颜色)。这是我的代码:
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中做更复杂的事情,只是简单地尝试调试我的问题。我在这里缺少什么?
答案 0 :(得分:6)
即使重写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)
}
}
答案 1 :(得分:0)
我明白了。显然即使你重写draw
,backgroundColor似乎仍然被考虑,默认为黑色。我将以下内容添加到透明视图类中:
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.clear
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
答案 2 :(得分:0)
" drawRect:如果您的视图绘制自定义内容,请实现此方法。如果您的视图没有进行任何自定义绘图,请避免覆盖此方法。" Link
如果说你只是在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)
}
}
请注意,更清晰的方法是在故事板中创建这些视图(而不是通过代码)。保持代码清晰,更容易理解并查看最新情况。