2016-07-25 4 views
1

У меня один из этих взглядов здесь:Swift: создание пользовательского интерфейса при вызове функции

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) 

Что я хочу, чтобы каждое из местContainerView отвечало.

Поэтому я хочу, чтобы представление было сгенерировано, и я дам ему определенные значения. И затем, когда я вызываю функцию createNewView(), я получу новое представление рядом с ним, которое будет точно таким же, за исключением любых новых значений, которые я вставляю.

Если у вас есть идеи, пожалуйста, дайте мне знать!

Спасибо

EDIT:

Приведенный ниже код демонстрирует, как я хочу, чтобы настроить placeContainerView каждый раз, но мне нужно, чтобы они были показаны так, что placeContainerView.topAnchor() каждый раз разный .. Как именно это работает, если оно хранится в своем классе и не знает, сколько раз оно было создано?

Кроме того, поскольку 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 
+0

Сначала создайте подкласс UIView, а не только вычисленное свойство. Затем вы можете передать соответствующий 'CGRect' в инициализатор' init (frame:) 'подкласса, когда вам понадобится экземпляр – Paulw11

ответ

1

Как отмечалось в @ Paulw11, эта задача выполняется просто путем создания нового класса.

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) 

Некоторые нечетным пример того, как использовать. Затем каждый раз, когда они нажимают кнопку, просто создайте новое местоContainerView

+0

. Я получаю вас. Я добавил дополнительную информацию к исходному сообщению, чтобы подчеркнуть некоторые из моих дальнейших путаниц. – tryingtolearn

+0

Когда происходит вызов func createNewView? Это поможет мне объяснить это. – impression7vx

+0

createNewView() будет вызываться, когда пользователь вводит что-то в панель поиска. В placeContainerView есть UILabel, который затем отображает то, что было введено в строку поиска. Это всего лишь способ записи чужих запросов. – tryingtolearn

Смежные вопросы