我在主视图中添加了一些UIViews,一个挨着另一个,以编程方式,如下所示:
//global variable
var lastLine: UIView!
//inside a function
for(var line = 0; line <= numberOfLines; line++){
lastLine = UIView(frame: CGRect(x: lengthOfSpace + lengthOfLine * CGFloat(line) + lengthOfSpace * CGFloat(line), y: 8 * view.frame.height/10, width: lengthOfLine, height: 7))
lastLine.backgroundColor = UIColor.whiteColor()
lastLine.layer.cornerRadius = lastLine.frame.height/4
view.addSubview(lastLine)
}
现在我想更改我创建的最后一行的颜色,所以我这样做了:
lastLine.backgroundColor = UIColor.blueColor()
但是只要我尝试从它们的 for 循环之外更改它,这些行都不会改变颜色。为什么会这样?有什么方法可以更改线条的颜色吗?
谢谢
问题可能围绕着如何声明事物(单个视图)与如何创建事物(潜在的视图数组)。为什么不使用 UIView 的标记属性来操作要更改的特定视图?
假设您有 5 行/视图并希望操作第 3 行。
用于创建 5 个视图的代码:
var numberOfLines:Int = 0
for line in 1...numberOfLines {
let newView = UIView()
// code to create and position UIView
newView.tag = line
view.addSubview(newView)
}
用于操作第三行/视图的代码:
func alterLine(_ lineNumber:Int) {
for view in view.subviews as [UIView] {
if view.tag = lineNumber {
// change view code
}
}
}
由于您使用 UIViews,您需要注意任何视图都可能将其标签属性设置为此行号,甚至是 UISlider!为了解决这个问题,你可以对UIView和LineView进行子类化,alterLine()将是:
func alterLine(_ lineNumber:Int) {
for view in self.view.subviews as [UIView] {
if let lineView = view as? LineView {
if lineView.tag = lineNumber {
//change LineView code
}
}
}
}
嗯,这很奇怪 - 因为它对我有用。 我把你的代码放在一个函数中,如果我在循环中设置背景颜色,那么每一行都会改变,如果我把它放在循环之外,只有最后一行会改变。
愚蠢的问题,但您没有指定这些行的大小 - 是否有可能将最后一行从屏幕上绘制出来,以便您看不到它?