我怎样才能重用UIView Swift?

时间:2017-02-15 08:57:45

标签: ios swift

我希望达到这样的形象。

enter image description here

这是我的视图我想将其重复用于分隔线

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

谢谢你。如果您需要任何信息,请告诉我:

3 个答案:

答案 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

enter image description here