我希望达到这样的形象。
这是我的视图我想将其重复用于分隔线
var sparteLine : UIView = {
var view = UIView()
view.backgroundColor = UIColor.blue // color blue for testing
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
我只是尝试通过这种方式来做但它不起作用..它只显示最后一个分隔线。第一个没有显示。我该怎么办?:
addSubview(sparteLine)
addSubview(disComment)
addSubview(disCommentTextField)
addSubview(sparteLine)
完整的源代码:https://gist.github.com/nazmulkp/c0b57185f76fb426634c65eb0476889e
谢谢你。如果您需要任何信息,请告诉我:答案 0 :(得分:4)
您尝试多次添加与子视图相同的视图,这是不可能的。
您可以做的是创建一个创建分隔符视图的函数,并在每次需要时创建一个。
func createSeparatorLine() -> UIView {
let view = UIView()
view.backgroundColor = .blue
view.translatesAutoresizingMaskIntoConstraints = false
return view
}
每次需要使用它时,只需调用此函数
即可let separator1 = createSeparatorLine()
addSubview(separator1)
编辑好点Grimxn
var separator: UIView {
let view = UIView()
view.backgroundColor = .blue
view.translatesAutoresizingMaskIntoConstraints = false
return view
}
addSubview(separator)
答案 1 :(得分:0)
你需要稍微改变一下代码。
根据我的观察,当你设置Constrains
时它正在接受新对象,所以在局部变量中捕获该视图对象并用它来设置Constrains
。
像这样:
let aSparteLine = sparteLine
self.view.addSubview(aSparteLine)
//Mark :- sparteLine
NSLayoutConstraint(item: aSparteLine, attribute: NSLayoutAttribute.top, relatedBy: .equal, toItem: self.view, attribute: .bottom, multiplier: 1, constant: 10).isActive = true
NSLayoutConstraint(item: aSparteLine, attribute: NSLayoutAttribute.left, relatedBy: .equal, toItem: self.view, attribute: NSLayoutAttribute.left, multiplier: 1, constant: 10).isActive = true
NSLayoutConstraint(item: aSparteLine, attribute: NSLayoutAttribute.right, relatedBy: .equal, toItem: self.view, attribute: NSLayoutAttribute.right, multiplier: 1, constant: -10).isActive = true
NSLayoutConstraint(item: aSparteLine, attribute: .height, relatedBy: .equal, toItem: self.view, attribute: .height, multiplier:0, constant: 5).isActive = true
希望这会对你有所帮助。
答案 2 :(得分:0)
您的代码存在两个问题:
1)您对sparteLine
的定义是执行一次闭包,因此您尝试添加UIView
的相同实例作为@DanW指出的两次子视图,将不起作用。有两种方法可以解决这个问题:
使var
成为getter而不是执行一次闭包:
var separator: UIView {
let view = UIView()
view.backgroundColor = .blue
view.translatesAutoresizingMaskIntoConstraints = false
return view
}
或使其成为一种功能。在任何一种情况下,您都将拥有两个独立的UIView实例。
2)您没有设置UIView
s的帧和/或约束,因此它们默认为无大小和重叠。
在Playground中尝试此操作(为清晰起见,删除了其他视图):
func sparteLine(_ y: CGFloat, _ colour: UIColor) -> UIView {
let view = UIView(frame: CGRect(x: 0, y: y, width: 200, height: 100))
view.backgroundColor = colour // color blue for testing
view.translatesAutoresizingMaskIntoConstraints = false
return view
}
let mainView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
mainView.addSubview(sparteLine(0, .blue))
mainView.addSubview(sparteLine(100, .red))
mainView