Search code examples
swiftimageviewscrollviewinfinite-loopfunc

add image view placed on uiscrollview in a infinite loop


My swift code below goal is to add a endless amount of image views to the uiscrollview. The image views should be separated by 200 pixels on the y axis each time the func add is called. I added a gif below of what I am looking to accomplish with the loop. I thing I have to put [] in the bar for this.

gif

   import UIKit

class ViewController: UIViewController {

var addBtn = UIButton()
var scrollView = UIScrollView()
var imageVV = UIImageView()



override func viewDidLoad() {
    super.viewDidLoad()

    [addBtn,scrollView,imageVV].forEach({

        view.addSubview($0)
        $0.translatesAutoresizingMaskIntoConstraints = false
    })
    addBtn.setTitle("add", for: .normal)



    addBtn.backgroundColor = .green
    imageVV.backgroundColor = .red
    scrollView.contentSize.height = 1000

    scrollView.isUserInteractionEnabled = true

    scrollView.backgroundColor = .blue
    scrollView.addSubview(imageVV)

    NSLayoutConstraint.activate([


        imageVV.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0),

        imageVV.topAnchor.constraint(equalTo: scrollView.topAnchor, constant : 0),
        imageVV.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.5, constant: 0),
        imageVV.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.10, constant: 0),








        scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0),
        scrollView.topAnchor.constraint(equalTo: view.topAnchor, constant : 0),
        scrollView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1, constant: 0),
        scrollView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.90, constant: 0),









        addBtn.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0),
        addBtn.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant : 0),
        addBtn.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1.0, constant: 0),
        addBtn.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.10, constant: 0),




    ] )


    addBtn.addTarget(self, action: #selector(add), for: .touchDown)


}

@objc func add(){
    NSLayoutConstraint.activate([



    ])


}


}

Solution

  • class ViewController: UIViewController{
    
        fileprivate var  lastImage:UIImageView?
        fileprivate var mainViewBootom:NSLayoutConstraint?
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
            view.backgroundColor = .white
            setupVIew()
        }
    
        override func viewDidAppear(_ animated: Bool) {
            scrollView.contentSize = CGSize(width: view.frame.width, height: mainView.frame.height)
            view.layoutIfNeeded()
        }
    
        //MARK: Components
        let scrollView:UIScrollView = {
            let sv = UIScrollView(frame: .zero)
            return sv
        }()
    
        let mainView:UIView = {
            let uv = UIView()
            uv.backgroundColor = .white
            return uv
        }()
    
        let btnAdd:UIButton = {
            let btn = UIButton(type: .system)
            btn.setTitle("Add", for: .normal)
            return btn
        }()
    
        //MARK: Setup UI
        func setupVIew() {
            view.addSubview(scrollView)
            view.addSubview(btnAdd)
    
            scrollView.translatesAutoresizingMaskIntoConstraints = false
            btnAdd.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                btnAdd.centerXAnchor.constraint(equalTo: view.centerXAnchor),
                btnAdd.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -12),
                btnAdd.widthAnchor.constraint(equalToConstant: 100),
                btnAdd.heightAnchor.constraint(equalToConstant: 45),
    
                scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
                scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
                scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
                scrollView.bottomAnchor.constraint(equalTo: btnAdd.topAnchor , constant: -12),
            ])
            btnAdd.addTarget(self, action: #selector(didClickedAdd), for: .touchUpInside)
    
            scrollView.addSubview(mainView)
            mainView.translatesAutoresizingMaskIntoConstraints = false
    
            NSLayoutConstraint.activate([
                mainView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
                mainView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
                mainView.topAnchor.constraint(equalTo: scrollView.topAnchor),
            ])
    
            let imgView = UIImageView(frame: CGRect(x: 0, y: 0, width: 150, height: 100))
            imgView.backgroundColor  = .red
            mainView.addSubview(imgView)
            imgView.translatesAutoresizingMaskIntoConstraints = false
            imgView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
            imgView.widthAnchor.constraint(equalToConstant: 150).isActive = true
            imgView.heightAnchor.constraint(equalToConstant: 100).isActive = true
    
            if lastImage != nil {
                imgView.topAnchor.constraint(equalTo: lastImage!.bottomAnchor , constant: 20).isActive = true
            }else{
                imgView.topAnchor.constraint(equalTo: mainView.topAnchor , constant: 12).isActive = true
            }
            lastImage = imgView
            mainViewBootom = mainView.bottomAnchor.constraint(equalTo: lastImage!.bottomAnchor , constant: 12)
            mainViewBootom!.isActive = true
        }
    
        @objc func didClickedAdd(){
            let imgView = UIImageView(frame: CGRect(x: 0, y: 0, width: 150, height: 100))
            imgView.backgroundColor  = .red
            mainView.addSubview(imgView)
            imgView.translatesAutoresizingMaskIntoConstraints = false
            imgView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
            imgView.widthAnchor.constraint(equalToConstant: 150).isActive = true
            imgView.heightAnchor.constraint(equalToConstant: 100).isActive = true
    
            if lastImage != nil {
                imgView.topAnchor.constraint(equalTo: lastImage!.bottomAnchor , constant: 20).isActive = true
            }else{
                imgView.topAnchor.constraint(equalTo: mainView.topAnchor , constant: 12).isActive = true
            }
            lastImage = imgView
            mainView.removeConstraint(mainViewBootom!)
            mainViewBootom = mainView.bottomAnchor.constraint(equalTo: lastImage!.bottomAnchor , constant: 12)
            mainViewBootom!.isActive = true
            view.layoutIfNeeded()
            scrollView.contentSize = CGSize(width: view.frame.width, height: mainView.frame.height)
            view.layoutIfNeeded()
    
        }
    
    
    }
    

    `result