Group Group Group Group Group Group Group Group Group

Add a endless amount of uviiews to the view controller

My swift code goals is to add a black box every time the user hits the button. Right now only 1 box is added and we the button is hit the new button just overrides the old button. I just need to make sure every time the button is hit a new black view is added to the view controller. Look at private func addBlackView() { that is where the black box is added.

class sampleViewController: UIViewController {

var image1Width2: NSLayoutConstraint!
var iHieght: NSLayoutConstraint!

override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white

view.addSubview(slider)
slider.translatesAutoresizingMaskIntoConstraints = false
slider.value = 0.5
slider.isUserInteractionEnabled = true
NSLayoutConstraint.activate([
    slider.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
    slider.leadingAnchor.constraint(equalTo: view.leadingAnchor),
    slider.heightAnchor.constraint(equalToConstant: 100),
    slider.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
])

view.addSubview(button)
button.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    button.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
    button.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16),
    button.widthAnchor.constraint(equalToConstant: 100),
    button.heightAnchor.constraint(equalToConstant: 80),
])
button.addTarget(self,action: #selector(addBlackView),for: .touchUpInside)
slider.addTarget(self, action: #selector(increase), for: .allEvents)

}

let slider:UISlider = {
let slider = UISlider(frame: .zero)
return slider
}()

private lazy var button: UIButton = {
let button = UIButton()
button.backgroundColor = .blue
button.setTitleColor(.white, for: .normal)
button.setTitle("add", for: .normal)
return button
}()

let blackView: UIView = {
let view = UIView()
view.backgroundColor = .black
return view
}()

@objc
private func addBlackView() {
self.view.addSubview(blackView)
blackView.translatesAutoresizingMaskIntoConstraints = false
blackView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
blackView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
image1Width2 = blackView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.1)
image1Width2.isActive = true
iHieght = blackView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.1)
iHieght.isActive = true
view.layoutIfNeeded()

let recognizer = UIPanGestureRecognizer(target: self, action: #selector(moveView(_:)))
blackView.addGestureRecognizer(recognizer)
}

@objc private func moveView(_ recognizer: UIPanGestureRecognizer) {
switch recognizer.state {
case .began:
    print("gesture began")
case .changed:
    let translation = recognizer.translation(in: self.view)

    recognizer.view!.center = .init(x: recognizer.view!.center.x + translation.x,
                                    y: recognizer.view!.center.y + translation.y)
    recognizer.setTranslation(.zero, in: self.view)
default:
    break
}
}

@objc func increase() {
image1Width2.constant = CGFloat(slider.value) * view.frame.size.width * 0.10
iHieght.constant = CGFloat(slider.value) * view.frame.size.width * 0.10
}}

Hi @timswift,

It looks like your method addBlackView() is adding the same black view because you’re referencing blackView which is an instance variable on your class. You should instead create an instance of the view inside your addBlackView method.

private func addBlackView() {
   let blackView = UIView() // new instance
   blackView.backgroundColor = .black
   self.view.addSubview(blackView)
   blackView.translatesAutoresizingMaskIntoConstraints = false
   // …
}

When you provide a self-executing closure to create a variable like you’re currently doing with blackView it will only be executed once when its parent is initialized, so accessing it again will reference the same instance of the view.

Hope this helps!