ViewController 操作后,Swift UIView 自定义视图不会更新
Posted
技术标签:
【中文标题】ViewController 操作后,Swift UIView 自定义视图不会更新【英文标题】:Swift UIView custom view won't update after ViewController action 【发布时间】:2016-01-29 19:44:29 【问题描述】:我希望视图控制器中的步进器在每次单击时更新我的自定义UIView
中的颜色。我不确定问题是由于类的实例还是变量的值(redd1
、greenn1
和 bluee1
)没有被更改。
这是我的第一个文件:
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);
【问题讨论】:
【参考方案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,以确保您的圈子不会被放置在不可见的地方。以上是关于ViewController 操作后,Swift UIView 自定义视图不会更新的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SWIFT 中更改 ViewController 后保留集合视图滚动位置
在添加/删除 ViewController 作为子视图 Swift 后,ParentView 属性设置为 nil
在Swift中更改ViewController后禁用任务栏?
在故事板中添加新的视图控制器后是不是需要手动添加 ViewController.swift 文件?