Swift 如何在UIStackView中实时排列元素?

Swift 如何在UIStackView中实时排列元素?,swift,uikit,uistackview,ios14,xcode12,Swift,Uikit,Uistackview,Ios14,Xcode12,我有一个水平轴的stackView,里面有UIView,我用它创建了一个图形 红色的一条是UIView,灰色的背景是stackView(在代码中称为mainStackView),现在我想实时移动该条,我正在尝试制作一个排序可视化程序,但我不知道怎么做 在UIKit(liveplayway中所有内容都是编程的)中,以下是主文件的源代码 主文件 if (arrayToSort[j].frame.size.height > arrayToSort[j+1].fra

我有一个水平轴的stackView,里面有UIView,我用它创建了一个图形

红色的一条是UIView,灰色的背景是stackView(在代码中称为mainStackView),现在我想实时移动该条,我正在尝试制作一个排序可视化程序,但我不知道怎么做 在UIKit(liveplayway中所有内容都是编程的)中,以下是主文件的源代码 主文件

                if (arrayToSort[j].frame.size.height > arrayToSort[j+1].frame.size.height){
    //               swap
                    var temp:UIView!
                    temp = arrayToSort[j]
                    arrayToSort[j] = arrayToSort[j+1]
                    arrayToSort[j+1] = temp
                    emptyStackView()
                    fillStackView(sortdArr: arrayToSort)
//                    delay here
                    
                }
以下是HomeViewController的源代码


import UIKit

public class HomeViewController:UIViewController{
    let stackView:UIStackView = {
        let st = UIStackView()
        st.axis = .horizontal
        st.alignment = .center
        st.distribution = .fill
        st.layer.shadowColor = UIColor.gray.cgColor
        st.layer.shadowOffset = .zero
        st.layer.shadowRadius = 5
        st.layer.shadowOpacity = 1
        st.spacing = 10
        st.translatesAutoresizingMaskIntoConstraints = false
        
        return st
    }()
    let generateButton:UIButton = {
        let btn = UIButton()
        btn.setTitle("Generate Array", for: .normal)
        btn.backgroundColor = UIColor(red: 0.92, green: 0.30, blue: 0.29, alpha: 1.00)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 20)
        btn.layer.cornerRadius = 10
        btn.layer.masksToBounds = true
        btn.heightAnchor.constraint(equalToConstant: 38).isActive = true
        btn.translatesAutoresizingMaskIntoConstraints = false
        return btn
    }()
    let BubbleSort:UIButton = {
        let btn = UIButton()
        btn.setTitle("BubbleSort", for: .normal)
        btn.backgroundColor = UIColor(red: 0.41, green: 0.43, blue: 0.88, alpha: 1.00)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = UIFont.italicSystemFont(ofSize: 20)
        btn.layer.cornerRadius = 10
        btn.layer.masksToBounds = true
        btn.heightAnchor.constraint(equalToConstant: 38).isActive = true
        btn.translatesAutoresizingMaskIntoConstraints = false
        return btn
    }()
    let MergeSort:UIButton = {
        let btn = UIButton()
        btn.setTitle("MergeSort", for: .normal)
        btn.backgroundColor = UIColor(red: 0.10, green: 0.16, blue: 0.34, alpha: 1.00)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = UIFont.italicSystemFont(ofSize: 20)
        btn.layer.cornerRadius = 10
        btn.layer.masksToBounds = true
        btn.heightAnchor.constraint(equalToConstant: 38).isActive = true
        btn.translatesAutoresizingMaskIntoConstraints = false
        return btn
    }()
    let InsertionSort:UIButton = {
        let btn = UIButton()
        btn.setTitle("InsertionSort", for: .normal)
        btn.backgroundColor = UIColor(red: 0.19, green: 0.22, blue: 0.32, alpha: 1.00)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = UIFont.italicSystemFont(ofSize: 20)
        btn.layer.cornerRadius = 10
        btn.layer.masksToBounds = true
        btn.heightAnchor.constraint(equalToConstant: 38).isActive = true
        btn.translatesAutoresizingMaskIntoConstraints = false
        return btn
    }()
    let SelectionSort:UIButton = {
        let btn = UIButton()
        btn.setTitle("SelectionSort", for: .normal)
        btn.backgroundColor = UIColor(red: 0.51, green: 0.20, blue: 0.44, alpha: 1.00)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = UIFont.italicSystemFont(ofSize: 20)
        btn.layer.cornerRadius = 10
        btn.layer.masksToBounds = true
        btn.heightAnchor.constraint(equalToConstant: 38).isActive = true
        btn.translatesAutoresizingMaskIntoConstraints = false
        return btn
    }()
    let mainStackView:UIStackView = {
        let st = UIStackView()
        st.backgroundColor = .gray
        st.axis = .horizontal
        st.distribution = .fillEqually
        st.alignment = .bottom
        st.spacing = 1
        st.translatesAutoresizingMaskIntoConstraints = false
        return st
    }()
    let baseView:UIView = {
        let vw = UIView()
        vw.backgroundColor = UIColor(red: 0.07, green: 0.54, blue: 0.65, alpha: 1.00)
        vw.translatesAutoresizingMaskIntoConstraints = false
        vw.layer.cornerRadius = 3
        vw.layer.masksToBounds = true
        vw.heightAnchor.constraint(equalToConstant: 15).isActive = true
        return vw
    }()
    public override   func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(stackView)
        view.addSubview(mainStackView)
        view.addSubview(baseView)
        edgesForExtendedLayout = []
        stackView.addArrangedSubview(generateButton)
        stackView.addArrangedSubview(BubbleSort)
        stackView.addArrangedSubview(MergeSort)
        stackView.addArrangedSubview(InsertionSort)
        stackView.addArrangedSubview(SelectionSort)
        
        stackView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        stackView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        stackView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        stackView.heightAnchor.constraint(equalToConstant: 50).isActive = true
        
        baseView.bottomAnchor.constraint(equalTo: view.bottomAnchor,constant: -2).isActive = true
        baseView.leftAnchor.constraint(equalTo: view.leftAnchor,constant: 5).isActive = true
        baseView.rightAnchor.constraint(equalTo: view.rightAnchor,constant: -5).isActive = true
        
        mainStackView.topAnchor.constraint(equalTo: stackView.bottomAnchor, constant: 5).isActive = true
        mainStackView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 5).isActive = true
        mainStackView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -5).isActive = true
        mainStackView.bottomAnchor.constraint(equalTo: baseView.topAnchor, constant: -5).isActive = true
        setButtons()
        buildRandomArray()
        
    }
    // MARK:- Actions
    func setButtons(){
        generateButton.addTarget(self, action: #selector(generatePressed), for: .touchUpInside)
        BubbleSort.addTarget(self, action: #selector(bubbleSort), for: .touchUpInside)
        MergeSort.addTarget(self, action: #selector(mergeSort), for: .touchUpInside)
        InsertionSort.addTarget(self, action: #selector(insertionSort), for: .touchUpInside)
        SelectionSort.addTarget(self, action: #selector(selectionSort), for: .touchUpInside)
    }
    func buildRandomArray(){
        var randomNumber :CGFloat!
        for _ in 1..<41{
            let viewStick:UIView = {
                let v = UIView()
                v.backgroundColor = .red
                v.translatesAutoresizingMaskIntoConstraints = false
                randomNumber = CGFloat(Int.random(in: 160...600))
                v.heightAnchor.constraint(equalToConstant: randomNumber).isActive = true
                v.frame.size.height = randomNumber
                return v
            }()
            mainStackView.addArrangedSubview(viewStick)
        }
        
    }
    @objc func generatePressed(){
        
        emptyStackView()
        buildRandomArray()
        print("Generating Array.....")
    }
    
    @objc func bubbleSort(){
        
        let n = mainStackView.arrangedSubviews.count
        var arrayToSort = mainStackView.arrangedSubviews
        
        for i in 0..<n-1{
            for j in 0..<n-i-1 {
                if (arrayToSort[j].frame.size.height > arrayToSort[j+1].frame.size.height){
                    //               swap
                    var temp:UIView!
                    temp = arrayToSort[j]
                    arrayToSort[j] = arrayToSort[j+1]
                    arrayToSort[j+1] = temp
                    
                    self.emptyStackView()
                    self.fillStackView(sortdArr: arrayToSort)
                    //                    delay here
                    
                }
            }
        }
        
        print("array sorted")
    }
    
    @objc func mergeSort(){
        print("Merge Sort.....")
    }
    
    @objc func insertionSort(){
        print("insertion Sort.....")
    }
    
    @objc func selectionSort(){
        print("selection Sort.....")
    }
    func emptyStackView(){
        for element in mainStackView.arrangedSubviews {
            mainStackView.removeArrangedSubview(element)
        }
    }
    func fillStackView(sortdArr:[UIView]){
        for vw in sortdArr {
            mainStackView.addArrangedSubview(vw)
        }
    }
}



导入UIKit
公共类HomeViewController:UIViewController{
let stackView:UIStackView={
设st=UIStackView()
横轴=水平轴
圣对齐=.中心
st.分布=.填充
st.layer.shadowColor=UIColor.gray.cgColor
st.layer.shadowOffset=.0
st.layer.shadowRadius=5
st.layer.shadowOpacity=1
标准间距=10
st.translatesAutoresizingMaskIntoConstraints=false
返回街
}()
let generateButton:UIButton={
设btn=UIButton()
btn.setTitle(“生成数组”,用于:。正常)
btn.backgroundColor=UIColor(红色:0.92,绿色:0.30,蓝色:0.29,阿尔法:1.00)
btn.setTitleColor(.white,表示:。正常)
btn.titleLabel?.font=UIFont.boldSystemFont(字体大小:20)
btn.layer.cornerRadius=10
btn.layer.masksToBounds=true
btn.heightAnchor.constraint(equalToConstant:38).isActive=true
btn.translatesAutoresizingMaskIntoConstraints=false
返回btn
}()
让BubbleSort:UIButton={
设btn=UIButton()
btn.setTitle(“BubbleSort”,用于:。正常)
btn.backgroundColor=UIColor(红色:0.41,绿色:0.43,蓝色:0.88,阿尔法:1.00)
btn.setTitleColor(.white,表示:。正常)
btn.titleLabel?.font=UIFont.italicSystemFont(大小:20)
btn.layer.cornerRadius=10
btn.layer.masksToBounds=true
btn.heightAnchor.constraint(equalToConstant:38).isActive=true
btn.translatesAutoresizingMaskIntoConstraints=false
返回btn
}()
让合并排序:UIButton={
设btn=UIButton()
btn.setTitle(“合并排序”,用于:。正常)
btn.backgroundColor=UIColor(红色:0.10,绿色:0.16,蓝色:0.34,阿尔法:1.00)
btn.setTitleColor(.white,表示:。正常)
btn.titleLabel?.font=UIFont.italicSystemFont(大小:20)
btn.layer.cornerRadius=10
btn.layer.masksToBounds=true
btn.heightAnchor.constraint(equalToConstant:38).isActive=true
btn.translatesAutoresizingMaskIntoConstraints=false
返回btn
}()
let InsertionSort:ui按钮={
设btn=UIButton()
btn.setTitle(“InsertionSort”,用于:。正常)
btn.backgroundColor=UIColor(红色:0.19,绿色:0.22,蓝色:0.32,阿尔法:1.00)
btn.setTitleColor(.white,表示:。正常)
btn.titleLabel?.font=UIFont.italicSystemFont(大小:20)
btn.layer.cornerRadius=10
btn.layer.masksToBounds=true
btn.heightAnchor.constraint(equalToConstant:38).isActive=true
btn.translatesAutoresizingMaskIntoConstraints=false
返回btn
}()
让选择排序:ui按钮={
设btn=UIButton()
btn.setTitle(“SelectionSort”,用于:。正常)
btn.backgroundColor=UIColor(红色:0.51,绿色:0.20,蓝色:0.44,阿尔法:1.00)
btn.setTitleColor(.white,表示:。正常)
btn.titleLabel?.font=UIFont.italicSystemFont(大小:20)
btn.layer.cornerRadius=10
btn.layer.masksToBounds=true
btn.heightAnchor.constraint(equalToConstant:38).isActive=true
btn.translatesAutoresizingMaskIntoConstraints=false
返回btn
}()
让mainStackView:UIStackView={
设st=UIStackView()
st.backgroundColor=.gray
横轴=水平轴
圣分布=
st.alignment=.bottom
st.间距=1
st.translatesAutoresizingMaskIntoConstraints=false
返回街
}()
让baseView:UIView={
设vw=UIView()
vw.backgroundColor=UIColor(红色:0.07,绿色:0.54,蓝色:0.65,阿尔法:1.00)
vw.translatesAutoResizezingMaskintoConstraints=false
vw.layer.cornerRadius=3
vw.layer.masksToBounds=true
vw.heightAnchor.constraint(equalToConstant:15).isActive=true
返回大众
}()
公共覆盖函数viewDidLoad(){
super.viewDidLoad()
view.addSubview(stackView)
view.addSubview(主背景视图)
view.addSubview(基本视图)
edgesForExtendedLayout=[]
stackView.addArrangedSubview(生成按钮)
stackView.addArrangedSubview(BubbleSort)
stackView.addArrangedSubview(合并排序)
stackView.addArrangedSubview(插入排序)
stackView.addArrangedSubview(选择排序)
stackView.topAnchor.constraint(equalTo:view.topAnchor).isActive=true
stackView.leftAnchor.constraint(equalTo:view.leftAnchor).isActive=true
stackView.rightAnchor.constraint(equalTo:view.rightAnchor).isActive=true
stackView.heightAnchor.constraint(equalToConstant:50).isActive=true
baseView.bottomAnchor.constraint(equalTo:view.bottomAnchor,常量:-2)。isActive=true
baseView.leftAnchor.constraint(equalTo:view.leftAnchor,常量:5)。isActive=true
baseView.rightAnchor.constraint(equalTo:view.rightAnchor,常量:-5)。isActive=true
mainStackView.topAnchor.constraint(等式:stackView.bottomAnchor,常量:5)。isActive=true
mainStackView.leftAnchor.constraint(equalTo:view.leftAnchor,常量:5)。isActive=true
mainStackView.rightAnchor.constraint(等式:view.rightAnchor,常数:-5)。isActive=true
mainStackView.bottomAnchor.constraint(等式:baseView.topAncho
for i in 1...200 {
    someView.frame.origin.x = CGFloat(i)
}
var i = 1
Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { timer in
    someView.frame.origin.x = CGFloat(i)
    i += 1
    if i > 200 {
        timer.invalidate()
    }
}
public class SortViewController:UIViewController{
    let stackView:UIStackView = {
        let st = UIStackView()
        st.axis = .horizontal
        st.alignment = .center
        st.distribution = .fillEqually
        st.layer.shadowColor = UIColor.gray.cgColor
        st.layer.shadowOffset = .zero
        st.layer.shadowRadius = 5
        st.layer.shadowOpacity = 1
        st.spacing = 10
        st.translatesAutoresizingMaskIntoConstraints = false
        
        return st
    }()
    let generateButton:UIButton = {
        let btn = UIButton()
        btn.setTitle("Generate", for: .normal)
        btn.backgroundColor = UIColor(red: 0.92, green: 0.30, blue: 0.29, alpha: 1.00)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 20)
        btn.layer.cornerRadius = 10
        btn.layer.masksToBounds = true
        btn.heightAnchor.constraint(equalToConstant: 38).isActive = true
        btn.translatesAutoresizingMaskIntoConstraints = false
        return btn
    }()
    let resetButton:UIButton = {
        let btn = UIButton()
        btn.setTitle("Reset", for: .normal)
        btn.backgroundColor = UIColor(red: 0.25, green: 0.75, blue: 0.29, alpha: 1.00)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 20)
        btn.layer.cornerRadius = 10
        btn.layer.masksToBounds = true
        btn.heightAnchor.constraint(equalToConstant: 38).isActive = true
        btn.translatesAutoresizingMaskIntoConstraints = false
        return btn
    }()
    let BubbleSort:UIButton = {
        let btn = UIButton()
        btn.setTitle("Bubble", for: .normal)
        btn.backgroundColor = UIColor(red: 0.41, green: 0.43, blue: 0.88, alpha: 1.00)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = UIFont.italicSystemFont(ofSize: 20)
        btn.layer.cornerRadius = 10
        btn.layer.masksToBounds = true
        btn.heightAnchor.constraint(equalToConstant: 38).isActive = true
        btn.translatesAutoresizingMaskIntoConstraints = false
        return btn
    }()
    let MergeSort:UIButton = {
        let btn = UIButton()
        btn.setTitle("Merge", for: .normal)
        btn.backgroundColor = UIColor(red: 0.10, green: 0.16, blue: 0.34, alpha: 1.00)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = UIFont.italicSystemFont(ofSize: 20)
        btn.layer.cornerRadius = 10
        btn.layer.masksToBounds = true
        btn.heightAnchor.constraint(equalToConstant: 38).isActive = true
        btn.translatesAutoresizingMaskIntoConstraints = false
        return btn
    }()
    let InsertionSort:UIButton = {
        let btn = UIButton()
        btn.setTitle("Insertion", for: .normal)
        btn.backgroundColor = UIColor(red: 0.19, green: 0.22, blue: 0.32, alpha: 1.00)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = UIFont.italicSystemFont(ofSize: 20)
        btn.layer.cornerRadius = 10
        btn.layer.masksToBounds = true
        btn.heightAnchor.constraint(equalToConstant: 38).isActive = true
        btn.translatesAutoresizingMaskIntoConstraints = false
        return btn
    }()
    let SelectionSort:UIButton = {
        let btn = UIButton()
        btn.setTitle("Selection", for: .normal)
        btn.backgroundColor = UIColor(red: 0.51, green: 0.20, blue: 0.44, alpha: 1.00)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = UIFont.italicSystemFont(ofSize: 20)
        btn.layer.cornerRadius = 10
        btn.layer.masksToBounds = true
        btn.heightAnchor.constraint(equalToConstant: 38).isActive = true
        btn.translatesAutoresizingMaskIntoConstraints = false
        return btn
    }()
    let mainStackView:UIStackView = {
        let st = UIStackView()
        st.backgroundColor = .gray
        st.axis = .horizontal
        st.distribution = .fillEqually
        st.alignment = .bottom
        st.spacing = 1
        st.translatesAutoresizingMaskIntoConstraints = false
        return st
    }()
    let baseView:UIView = {
        let vw = UIView()
        vw.backgroundColor = UIColor(red: 0.07, green: 0.54, blue: 0.65, alpha: 1.00)
        vw.translatesAutoresizingMaskIntoConstraints = false
        vw.layer.cornerRadius = 3
        vw.layer.masksToBounds = true
        vw.heightAnchor.constraint(equalToConstant: 15).isActive = true
        return vw
    }()
    public override   func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(stackView)
        view.addSubview(mainStackView)
        view.addSubview(baseView)
        edgesForExtendedLayout = []
        stackView.addArrangedSubview(generateButton)
        stackView.addArrangedSubview(resetButton)
        stackView.addArrangedSubview(BubbleSort)
        stackView.addArrangedSubview(MergeSort)
        stackView.addArrangedSubview(InsertionSort)
        stackView.addArrangedSubview(SelectionSort)
        
        stackView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        stackView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        stackView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        stackView.heightAnchor.constraint(equalToConstant: 50).isActive = true
        
        baseView.bottomAnchor.constraint(equalTo: view.bottomAnchor,constant: -2).isActive = true
        baseView.leftAnchor.constraint(equalTo: view.leftAnchor,constant: 5).isActive = true
        baseView.rightAnchor.constraint(equalTo: view.rightAnchor,constant: -5).isActive = true
        
        mainStackView.topAnchor.constraint(equalTo: stackView.bottomAnchor, constant: 5).isActive = true
        mainStackView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 5).isActive = true
        mainStackView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -5).isActive = true
        mainStackView.bottomAnchor.constraint(equalTo: baseView.topAnchor, constant: -5).isActive = true
        setButtons()
        buildRandomArray()
        
    }
    // MARK:- Actions
    func setButtons(){
        generateButton.addTarget(self, action: #selector(generatePressed), for: .touchUpInside)
        resetButton.addTarget(self, action: #selector(resetPressed), for: .touchUpInside)
        BubbleSort.addTarget(self, action: #selector(bubbleSort), for: .touchUpInside)
        MergeSort.addTarget(self, action: #selector(mergeSort), for: .touchUpInside)
        InsertionSort.addTarget(self, action: #selector(insertionSort), for: .touchUpInside)
        SelectionSort.addTarget(self, action: #selector(selectionSort), for: .touchUpInside)
    }
    
    let sampleValues: [Int] = [
        150, 175, 200, 225, 250, 275, 300, 325, 350, 375, 400, 425, 450, 475, 500
    ]
    
    var currentArray: [UIView] = []
    
    let barColor: UIColor = .cyan
    let barHighlight: UIColor = .yellow
    
    let timerInterval: TimeInterval = 0.10
    
    func buildRandomArray(){
        
        // we can populate the stack view much quicker by generating an array of views
        //  and then looping through that array to add them as arrangedSubviews
        currentArray = []
        
        // for ease during dev, use a set of predefined values
        if true {
            let hh = sampleValues.shuffled()
            hh.forEach { h in
                let viewStick: UILabel = {
                    let v = UILabel()
                    v.backgroundColor = barColor
                    v.text = "\(h)"
                    v.textAlignment = .center
                    v.heightAnchor.constraint(equalToConstant: CGFloat(h)).isActive = true
                    return v
                }()
                currentArray.append(viewStick)
            }
        } else {
            var randomNumber :CGFloat!
            for _ in 1..<41{
                let viewStick:UIView = {
                    let v = UIView()
                    v.backgroundColor = barColor
                    v.translatesAutoresizingMaskIntoConstraints = false
                    randomNumber = CGFloat(Int.random(in: 160...500))
                    v.heightAnchor.constraint(equalToConstant: randomNumber).isActive = true
                    return v
                }()
                currentArray.append(viewStick)
            }
        }
        fillStackView(sortdArr: currentArray)
        
    }
    
    @objc func generatePressed(){
        
        // stop the timer if a sort is currently running
        timer?.invalidate()
        
        print("Generating Array.....")
        
        emptyStackView()
        buildRandomArray()
        
    }
    
    @objc func resetPressed(){
        
        // stop the timer if a sort is currently running
        timer?.invalidate()
        
        print("Resetting.....")
        
        fillStackView(sortdArr: currentArray)
        
    }
    
    var timer: Timer?
    
    @objc func bubbleSort(){
        print("Bubble Sort....")
        
        // if a sort is running, stop it and reset the bars
        if let t = timer, t.isValid {
            resetPressed()
        }
        
        var j: Int = 0
        
        var didSwap: Bool = false
        
        var lastBarToCheck: Int = mainStackView.arrangedSubviews.count - 1
        
        // set current bar to first bar
        var curBar = mainStackView.arrangedSubviews[0]
        // set new current bar background to barHighlight
        curBar.backgroundColor = barHighlight
        
        timer = Timer.scheduledTimer(withTimeInterval: timerInterval, repeats: true) { timer in
            
            // if we have more bars to check
            if j < lastBarToCheck {
                
                if self.mainStackView.arrangedSubviews[j].frame.height > self.mainStackView.arrangedSubviews[j+1].frame.height {
                    // next bar is shorter than current bar, so
                    // swap the bar positions
                    self.mainStackView.insertArrangedSubview(curBar, at: j + 1)
                    // set the didSwap flag
                    didSwap = true
                } else {
                    // next bar is taller
                    // set current bar background back to barColor
                    curBar.backgroundColor = self.barColor
                    // set current bar to next bar
                    curBar = self.mainStackView.arrangedSubviews[j+1]
                    // set new current bar background to barHighlight
                    curBar.backgroundColor = self.barHighlight
                }
                j += 1
                
            } else {
                
                if !didSwap {
                    
                    // no bars were swapped, so
                    // set current bar back to barColor
                    curBar.backgroundColor = self.barColor
                    // stop the looping
                    timer.invalidate()
                    print("Done!")
                    
                } else {
                    
                    // at least one swap occurred, so
                    // decrement number of bars to check
                    lastBarToCheck -= 1
                    // reset index
                    j = 0
                    // set current bar back to barColor
                    curBar.backgroundColor = self.barColor
                    // set current bar background to first bar
                    curBar = self.mainStackView.arrangedSubviews[j]
                    // set new current bar background to barHighlight
                    curBar.backgroundColor = self.barHighlight
                    // reset swap flag
                    didSwap = false
                    
                }
                
            }
            
        }
        
    }
    
    @objc func mergeSort(){
        print("Merge Sort.....")
    }
    
    @objc func insertionSort(){
        print("Insertion Sort.....")
        
        // if a sort is running, stop it and reset the bars
        if let t = timer, t.isValid {
            resetPressed()
        }
        
        var index: Int = 1
        var position: Int = 1
        
        // set current bar to index bar
        var curBar = mainStackView.arrangedSubviews[index]
        // set new current bar background to barHighlight
        curBar.backgroundColor = barHighlight
        
        timer = Timer.scheduledTimer(withTimeInterval: timerInterval, repeats: true) { timer in
            
            // if we have more bars to check
            if index < self.mainStackView.arrangedSubviews.count {
                // if we're not at the left-most bar
                if position > 0 {
                    // if bar-to-the-left is taller than current bar
                    if self.mainStackView.arrangedSubviews[position - 1].frame.height > curBar.frame.height {
                        // move current bar one position to the left
                        self.mainStackView.insertArrangedSubview(curBar, at: position - 1)
                        position -= 1
                    } else {
                        // bar-to-the-left is shorter than current bar
                        index += 1
                        position = index
                        // set current bar background back to barColor
                        curBar.backgroundColor = self.barColor
                        // if we're not finished
                        if index < self.mainStackView.arrangedSubviews.count {
                            // set current bar to next bar
                            curBar = self.mainStackView.arrangedSubviews[index]
                            // set new current bar background to barHighlight
                            curBar.backgroundColor = self.barHighlight
                        }
                    }
                } else {
                    // we're at the left-most bar
                    // increment index
                    index += 1
                    position = index
                    // set current bar background back to barColor
                    curBar.backgroundColor = self.barColor
                    // if we have more bars to check
                    if index < self.mainStackView.arrangedSubviews.count {
                        // set current bar to next bar
                        curBar = self.mainStackView.arrangedSubviews[index]
                        // set new current bar background to barHighlight
                        curBar.backgroundColor = self.barHighlight
                    }
                }
            } else {
                // we've reached the end of the array
                // stop the looping
                timer.invalidate()
                print("Done!")
            }
        }
        
    }
    
    @objc func selectionSort(){
        print("selection Sort.....")
    }

    func emptyStackView(){
        mainStackView.arrangedSubviews.forEach {
            $0.removeFromSuperview()
        }
    }
    func fillStackView(sortdArr:[UIView]){
        sortdArr.forEach { vw in
            vw.backgroundColor = self.barColor
            mainStackView.addArrangedSubview(vw)
        }
    }
}
    // add 10 arranged subviews
    for i in 0..<10 {
        let v = UILabel()
        v.text = "\(i)"
        v.textAlignment = .center
        v.backgroundColor = .green
        stackView.addArrangedSubview(v)
    }
    //  (arrays are zero-based)
    stackView.insertArrangedSubview(stackView.arrangedSubviews[3], at: 4)