【问题标题】:Swift UIView custom view won't update after ViewController actionViewController 操作后,Swift UIView 自定义视图不会更新
【发布时间】:2016-01-29 19:44:29
【问题描述】:

我希望视图控制器中的步进器在每次单击时更新我的​​自定义UIView 中的颜色。我不确定问题是由于类的实例还是变量的值(redd1greenn1bluee1)没有被更改。

这是我的第一个文件:

class ViewController: UIViewController {
    var colors = UIView1();
    @IBOutlet var redStepper: UIStepper!
    @IBOutlet var greenStepper: UIStepper!
    @IBOutlet var blueStepper: UIStepper!

    @IBAction func redChange(sender: UIStepper)
    {
        redValue.text = Int(sender.value).description;
        colors.redd1 = Double(sender.value);
        //self.view.setNeedsDisplay()
    }
    @IBAction func greenChange(sender: UIStepper)
    {
        greenValue.text = Int(sender.value).description;
        colors.greenn1 = Double(sender.value);
        //self.view.setNeedsDisplay()
    }
    @IBAction func blueChange(sender: UIStepper)
    {
        blueValue.text = Int(sender.value).description;
        colors.bluee1 = Double(sender.value);
        //self.view.setNeedsDisplay()
    } 
}

这是我的第二个文件:

class UIView1: UIView {
    var redd1 = 0.0;
    var greenn1 = 0.0;
    var bluee1 = 0.0;

    override init(frame: CGRect)
    {
        super.init(frame: frame)
    }
    required init?(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)
    }
    override func drawRect(rect: CGRect)
    {
        let circle = UIView(frame: CGRect(x: -75.0, y: -40.0, width: 200.0, height: 200.0))
        circle.layer.cornerRadius = 50.0;
        let startingColor = UIColor(red: (CGFloat(redd1))/255, green: (CGFloat(greenn1))/255, blue: (CGFloat(bluee1))/255, alpha: 1.0)
        circle.backgroundColor = startingColor;
        addSubview(circle);
    }
}

【问题讨论】:

    标签: ios swift uiview instance viewcontroller


    【解决方案1】:

    drawRect 仅在添加视图时调用,因此在您的示例中,drawRect 被调用一次,而不是在更改步进器之后调用。

    相反,将您的步进文件更改为:

    @IBOutlet var redStepper: UIStepper!
    @IBOutlet var greenStepper: UIStepper!
    @IBOutlet var blueStepper: UIStepper!
    
    @IBAction func redChange(sender: UIStepper) {
        redValue.text = Int(sender.value).description;
        colors.redd1 = Double(sender.value);
        updateColor()
    }
    
    @IBAction func greenChange(sender: UIStepper) {
        greenValue.text = Int(sender.value).description;
        colors.greenn1 = Double(sender.value);
        updateColor()
    }
    
    @IBAction func blueChange(sender: UIStepper) {
        blueValue.text = Int(sender.value).description;
        colors.bluee1 = Double(sender.value);
        updateColor()
    } 
    

    然后将 updateColor 函数添加到你的 UIView1 类中:

    class UIView1: UIView {
    
        var redd1 = 0.0;
        var greenn1 = 0.0;
        var bluee1 = 0.0;
    
        func updateColor() {
            let circle = UIView(frame: CGRect(x: -75.0, y: -40.0, width: 200.0, height: 200.0))
            circle.layer.cornerRadius = 50.0;
            let startingColor = UIColor(red: (CGFloat(redd1))/255, green: (CGFloat(greenn1))/255, blue: (CGFloat(bluee1))/255, alpha: 1.0)
            circle.backgroundColor = startingColor;
            addSubview(circle);
        }
    }
    

    【讨论】:

    • 首先,尝试在您的 IBActions 中添加 print(sender.value) 以确保您收到正确的值。如果发生这种情况,请将 print(redd1)、print(greenn1) 和 print(bluee1) 添加到您的 updateColor() 函数中,以查看是接收值还是运行。
    • 是不是因为updateColor函数没有覆盖drawRect函数
    • 可以去掉drawRect函数,不需要。如果 updateColor 正在运行,则表示正在添加圆圈。我注意到您的 x 和 y 有负值,请尝试将它们都设置为 0,以确保您的圈子不会被放置在不可见的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2016-10-26
    相关资源
    最近更新 更多