Don_Mag icon

Untitled

Don_Mag | PRO | 12/03/19 08:46:32 PM UTC | 0 ⭐ | 1281 👁️ | Never ⏰ | []
Swift |

3.57 KB

|

None

|

0 👍

/

0 👎

/*
Here is some sample code for a quick test of adding 48 labels (8 to each of 6 stack views).
 
The button at the top toggles between adding / removing the labels, so it can be run multiple times.
 
On an iPad Air (`ME991LL/A`), I get 0.03 seconds or less.
*/
 
class ViewController: UIViewController {
    
    let theBtn: UIButton = {
        let v = UIButton()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.setTitle("Add Views", for: .normal)
        v.setContentHuggingPriority(.required, for: .vertical)
        v.backgroundColor = .red
        return v
    }()
    
    let promptLabel: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.textAlignment = .center
        v.text = "Tap button to:"
        return v
    }()
    
    let statLabel: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .cyan
        v.textAlignment = .center
        v.text = ""
        return v
    }()
    
    let topStackView: UIStackView = {
        let v = UIStackView()
        v.axis = .vertical
        v.distribution = .fillEqually
        v.spacing = 4
        v.translatesAutoresizingMaskIntoConstraints = false
        return v
    }()
    
    let hStackView: UIStackView = {
        let v = UIStackView()
        v.axis = .horizontal
        v.distribution = .fillEqually
        v.spacing = 8
        v.translatesAutoresizingMaskIntoConstraints = false
        return v
    }()
 
    var stackViews: [UIStackView] = [UIStackView]()
    
    var jCounter = 1
 
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .white
        
        for _ in 1...6 {
            let v = UIStackView()
            v.axis = .vertical
            v.distribution = .fillEqually
            v.spacing = 8
            v.translatesAutoresizingMaskIntoConstraints = false
            stackViews.append(v)
        }
        
        topStackView.addArrangedSubview(promptLabel)
        topStackView.addArrangedSubview(theBtn)
        topStackView.addArrangedSubview(statLabel)
 
        view.addSubview(topStackView)
        view.addSubview(hStackView)
        
        let g = view.safeAreaLayoutGuide
        
        NSLayoutConstraint.activate([
            
            topStackView.topAnchor.constraint(equalTo: g.topAnchor, constant: 20.0),
            topStackView.centerXAnchor.constraint(equalTo: g.centerXAnchor, constant: 0.0),
            topStackView.widthAnchor.constraint(equalToConstant: 300.0),
            
            hStackView.topAnchor.constraint(equalTo: topStackView.bottomAnchor, constant: 20.0),
            hStackView.bottomAnchor.constraint(equalTo: g.bottomAnchor, constant: -8.0),
            hStackView.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 8.0),
            hStackView.trailingAnchor.constraint(equalTo: g.trailingAnchor, constant: -8.0),
 
        ])
        
        stackViews.forEach {
            hStackView.addArrangedSubview($0)
        }
        
        theBtn.addTarget(self, action: #selector(addViews(_:)), for: .touchUpInside)
        
    }
    
    func doAddViews() -> Void {
 
        let start = CFAbsoluteTimeGetCurrent()
        
        stackViews.forEach {
            sv in
            for _ in 1...8 {
                let v = UILabel()
                v.font = UIFont.systemFont(ofSize: 10.0, weight: .medium)
                v.backgroundColor = .yellow
                v.textAlignment = .center
                v.text = "\(jCounter)"
                sv.addArrangedSubview(v)
                jCounter += 1
            }
        }
        
        let end = CFAbsoluteTimeGetCurrent() - start
        
        statLabel.text = "Elapsed Time: \(end)"
        
    }
    
    @objc func addViews(_ sender: Any?) -> Void {
 
        if stackViews.first?.arrangedSubviews.count == 0 {
 
            doAddViews()
            
            theBtn.setTitle("Clear Views", for: .normal)
 
        } else {
 
            stackViews.forEach {
                sv in
                sv.arrangedSubviews.forEach {
                    $0.removeFromSuperview()
                }
            }
 
            statLabel.text = ""
 
            theBtn.setTitle("Add Views", for: .normal)
 
        }
        
    }
    
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎