Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 透明视图是黑色的吗?_Ios_Swift_Uikit - Fatal编程技术网

Ios 透明视图是黑色的吗?

Ios 透明视图是黑色的吗?,ios,swift,uikit,Ios,Swift,Uikit,我试图创建一个在某些点上是透明的视图,以便看到后面的图像。然而,由于某些原因,在视图的透明部分,我看到的是黑色,而不是视图背后的内容。我已经把它缩减到很少的代码,不明白为什么我的透明视图显示黑色而不是红色(后面视图的颜色)。这是我的密码: class ViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animat

我试图创建一个在某些点上是透明的视图,以便看到后面的图像。然而,由于某些原因,在视图的透明部分,我看到的是黑色,而不是视图背后的内容。我已经把它缩减到很少的代码,不明白为什么我的透明视图显示黑色而不是红色(后面视图的颜色)。这是我的密码:

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)
    }
}


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

我发现了。显然,即使您覆盖了
绘图
,背景色似乎仍然会被考虑,默认为黑色。我在透明视图类中添加了以下内容:

override init(frame: CGRect) {
    super.init(frame: frame)

    backgroundColor = UIColor.clear
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

我想出来了。显然,即使您覆盖了
绘图
,背景色似乎仍然会被考虑,默认为黑色。我在透明视图类中添加了以下内容:

override init(frame: CGRect) {
    super.init(frame: frame)

    backgroundColor = UIColor.clear
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

使用
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)
    }
}

使用
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)
    }
}
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上更好,而不是在VIEWWILLEASE中。因为它将在每次您的视图转到前台时执行,并且u将以添加两个透明视图结束。 另外,将这些行保留在带有私有函数的扩展中有助于保持代码的清晰

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)
    }
}
请注意,更清晰的方法是在故事板中创建这些视图(而不是通过代码)。保持代码清晰,易于理解和查看发生的情况。

“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上更好,而不是在VIEWWILLEASE中。因为它将在每次您的视图转到前台时执行,并且u将以添加两个透明视图结束。 另外,将这些行保留在带有私有函数的扩展中有助于保持代码的清晰

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)
    }
}

请注意,更清晰的方法是在故事板中创建这些视图(而不是通过代码)。保持代码清晰,易于理解和查看发生了什么。

self.opaque=false将其添加到
透明视图
构造函数中。然后,您可以在
draw
方法中执行任何您想要的操作。
self.opaque=false将其添加到
透明视图
构造函数中。然后你可以在
draw
方法中做你想做的任何事情。啊,我不知道那个属性,也许这比我的解决方案更干净。实际上设置那个属性不会改变行为。记住,我是个白痴,我将isOpaque设置为true,这行得通啊,我不知道那个属性,也许这比我的解决方案更简洁。实际上,设置该属性不会改变行为。尽管我是个白痴,但我将isOpaque设置为true,确实如此work@Kven迪特拉格里亚,你有我的解决方案吗?加上我的答案,如果比选择的答案更好的话。a+1呢?如果你重新阅读我特别说的问题,我意识到它太简单,无法使用drawRect,但我的实际代码要复杂得多,需要绘制,但你的答案还是删除了它。@Kven DiTraglia你有没有用我的解决方案结束?加上我的答案,如果比选择的答案更好的话。那么a+1呢?如果你重新阅读我特别提到的问题,我意识到使用drawRect太简单了,但是我的实际代码要复杂得多,需要绘制,但是你的答案还是删除了它。