Swift:调用函数时创建UI

Swift: creating UI when function is called

我这里有以下视图之一:

let placeContainerView: UIView = {
    let view = UIView()
    view.backgroundColor = UIColor.whiteColor()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.layer.cornerRadius = 7
    view.layer.masksToBounds = true

    return view
}()

我希望在每次调用函数 "createNewView()" 时在它旁边创建一个。

    let showFullPlaceContainerView = UITapGestureRecognizer(target: self, action: #selector(showFullPlaceContainerViewFunction))
    placeContainerView.addGestureRecognizer(showFullPlaceContainerView)

我希望每个 placeContainerView 都能响应。

所以我想要生成一个视图,我将给它特定的值。然后当我调用函数 createNewView() 时,我会在它旁边得到一个新视图,除了我输入的任何新值外,它完全相同。

如果您有任何想法,请告诉我!

谢谢

编辑:

下面的代码演示了我想如何每次设置 placeContainerView,但我需要显示它们,以便 placeContainerView.topAnchor() 每次都不同。如果保留它,它究竟如何工作在它自己的 class 中,不知道它被创建了多少次?

此外,由于 placeContainerView 包含 placeLabel 和 placeImageView,是否也必须在新的 PlaceContainerViewClass 中生成它们?

func setupPlaceContainerView() {
    placeContainerView.leftAnchor.constraintEqualToAnchor(view.leftAnchor, constant: -180).active = true
    placeContainerView.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 80).active = true
    placeContainerView.widthAnchor.constraintEqualToConstant(227).active = true
    placeContainerView.heightAnchor.constraintEqualToConstant(45).active = true


    placeContainerView.addSubview(placeLabel)
    placeContainerView.addSubview(placeImageLabelSeparator)
    placeContainerView.addSubview(placeImageView)

    placeLabel.leftAnchor.constraintEqualToAnchor(placeContainerView.leftAnchor).active = true
    placeLabel.topAnchor.constraintEqualToAnchor(placeContainerView.topAnchor).active = true
    placeLabel.widthAnchor.constraintEqualToConstant(180).active = true
    placeLabel.heightAnchor.constraintEqualToAnchor(placeContainerView.heightAnchor).active = true

    placeImageLabelSeparator.leftAnchor.constraintEqualToAnchor(placeLabel.rightAnchor).active = true
    placeImageLabelSeparator.topAnchor.constraintEqualToAnchor(placeContainerView.topAnchor).active = true
    placeImageLabelSeparator.widthAnchor.constraintEqualToConstant(2).active = true
    placeImageLabelSeparator.heightAnchor.constraintEqualToAnchor(placeContainerView.heightAnchor).active = true

    placeImageView.leftAnchor.constraintEqualToAnchor(placeImageLabelSeparator.rightAnchor).active = true
    placeImageView.topAnchor.constraintEqualToAnchor(placeContainerView.topAnchor).active = true
    placeImageView.widthAnchor.constraintEqualToConstant(45).active = true
    placeImageView.heightAnchor.constraintEqualToAnchor(placeContainerView.heightAnchor).active = true

如@Paulw11 所述,此任务只需创建一个新的 class。

class placeContainerView:UIView {

    var x:Double!
    var y:Bool!
    var z:UILabel!
    var controller:UIViewController!

    //If you want to pass specific values number, you can use convenience init method OR you can use the default init method they give you.
    //previousLabelFrame:CGrect = CGRect() // I defaulted all these values to 0, make them whatevree u need. You would use the default one for the first Label you would make. Then after that, you would pass in the previous one made, to get the frame of it so you can add to the one after that. 
    convenience init(x:Double,y:Bool, z:UILabel, previousLabelFrame:CGRect = CGRect(x: 0, y:0, width:0, height:0), VC:UIViewController) {
        self.x = x
        self.y = y
        self.z = z
        self.controller = VC
        let distance = self.controller.width*0.1 //Whatever u decide here
        //You could just do CGRect(x:previousLabelFrame.maxX+distance, depeding on what you need. 
        self.frame = CGRect(x: previousLabelFrame.minX+distance, y:previousLabelFrame.minY, width: previousLabelFrame.width, height:previousLabelFrame.height)
    }

}

ViewController里面的用法:

var views:[placeContainerView] = []

let view:placeContainerView = placeContainerView(10, true, UILabel(),views[views.count-1], self)
 self.views.append(view)
//OR if this is the FIRST placeContainerView of the whole app, it will use the default values for the frame.
let view:placeContainerView = placeContainerView(10, true, UILabel(), self)
self.views.append(view)

一些奇怪的使用示例。 然后每次他们点击一个按钮,就创建一个新的 placeContainerView