Don_Mag icon

Stack View Distributions

Don_Mag | PRO | 07/05/23 05:07:48 PM UTC | 0 ⭐ | 8055 👁️ | Never ⏰ | []
Swift |

5.66 KB

|

None

|

0 👍

/

0 👎

 
class StackVC: UIViewController {
 
    var noHeightSVs: [UIStackView] = []
    var withHeightSVs: [UIStackView] = []
 
    let bottomText: String = "Another label with different content"
    
    var topTexts: [String] = [
        "This is a long label with dynamic content",
        "Here is even more text being changed after the initial display to show how it automatically resizes",
    ]
    
    override func viewDidLoad() {
        super.viewDidLoad()
 
        view.backgroundColor = .systemBackground
 
        let labelColors: [UIColor] = [.cyan, .green,]
 
        let topText: String = topTexts.removeFirst()
        topTexts.append(topText)
        
        var sv: UIStackView!
        for _ in 0..<5 {
            sv = UIStackView()
            sv.axis = .vertical
            sv.spacing = 10
            sv.widthAnchor.constraint(equalToConstant: 200.0).isActive = true
            sv.heightAnchor.constraint(equalToConstant: 300.0).isActive = true
            for (str, clr) in zip([topText, bottomText], labelColors) {
                let label = UILabel()
                label.numberOfLines = 0
                label.backgroundColor = clr
                label.text = str
                sv.addArrangedSubview(label)
            }
            withHeightSVs.append(sv)
 
            sv = UIStackView()
            sv.axis = .vertical
            sv.spacing = 10
            sv.widthAnchor.constraint(equalToConstant: 200.0).isActive = true
            // NO height anchor
            for (str, clr) in zip([topText, bottomText], labelColors) {
                let label = UILabel()
                label.numberOfLines = 0
                label.backgroundColor = clr
                label.text = str
                sv.addArrangedSubview(label)
            }
            noHeightSVs.append(sv)
        }
        
        let g = view.safeAreaLayoutGuide
        
        let instruction = UILabel()
        instruction.font = .italicSystemFont(ofSize: 20.0)
        instruction.text = "Tap anywhere to toggle top label text."
        instruction.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(instruction)
        NSLayoutConstraint.activate([
            instruction.topAnchor.constraint(equalTo: g.topAnchor, constant: 100.0),
            instruction.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 60.0),
        ])
 
        let titleLabelW = UILabel()
        titleLabelW.text = "Stack Views WITH height constraints:"
        titleLabelW.textColor = .blue
        
        let titleLabelN = UILabel()
        titleLabelN.text = "Stack Views WITHOUT height constraints:"
        titleLabelN.textColor = .blue
 
        [titleLabelW, titleLabelN].forEach { v in
            v.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(v)
        }
        
        titleLabelW.topAnchor.constraint(equalTo: instruction.bottomAnchor, constant: 40.0).isActive = true
        titleLabelW.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 60.0).isActive = true
 
        var prevView: UIStackView!
 
        prevView = nil
        withHeightSVs.forEach { v in
            v.backgroundColor = .yellow
            v.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(v)
            v.topAnchor.constraint(equalTo: titleLabelW.bottomAnchor, constant: 40.0).isActive = true
            if prevView == nil {
                v.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 60.0).isActive = true
            } else {
                v.leadingAnchor.constraint(equalTo: prevView.trailingAnchor, constant: 20.0).isActive = true
            }
            prevView = v
        }
 
        titleLabelN.topAnchor.constraint(equalTo: withHeightSVs[0].bottomAnchor, constant: 60.0).isActive = true
        titleLabelN.leadingAnchor.constraint(equalTo: titleLabelW.leadingAnchor, constant: 0.0).isActive = true
        
        prevView = nil
        noHeightSVs.forEach { v in
            v.backgroundColor = .yellow
            v.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(v)
            v.topAnchor.constraint(equalTo: titleLabelN.bottomAnchor, constant: 40.0).isActive = true
            if prevView == nil {
                v.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 60.0).isActive = true
            } else {
                v.leadingAnchor.constraint(equalTo: prevView.trailingAnchor, constant: 20.0).isActive = true
            }
            prevView = v
        }
 
        let dists: [UIStackView.Distribution] = [
            .fill, .equalSpacing, .equalCentering, .fillEqually, .fillProportionally,
        ]
        for (sv, d) in zip(withHeightSVs, dists) {
            sv.distribution = d
        }
        for (sv, d) in zip(noHeightSVs, dists) {
            sv.distribution = d
        }
        
        let infos: [String] = [
            ".fill", ".equalSpacing", ".equalCentering", ".fillEqually", ".fillProportionally",
        ]
 
        for (str, sv) in zip(infos, withHeightSVs) {
            let label = UILabel()
            label.font = .systemFont(ofSize: 16, weight: .bold)
            label.textColor = .red
            label.textAlignment = .center
            label.text = str
            label.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(label)
            NSLayoutConstraint.activate([
                label.leadingAnchor.constraint(equalTo: sv.leadingAnchor),
                label.trailingAnchor.constraint(equalTo: sv.trailingAnchor),
                label.bottomAnchor.constraint(equalTo: sv.topAnchor, constant: -8.0),
            ])
        }
        for (str, sv) in zip(infos, noHeightSVs) {
            let label = UILabel()
            label.font = .systemFont(ofSize: 16, weight: .bold)
            label.textColor = .red
            label.textAlignment = .center
            label.text = str
            label.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(label)
            NSLayoutConstraint.activate([
                label.leadingAnchor.constraint(equalTo: sv.leadingAnchor),
                label.trailingAnchor.constraint(equalTo: sv.trailingAnchor),
                label.bottomAnchor.constraint(equalTo: sv.topAnchor, constant: -8.0),
            ])
        }
        
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        
        let topText: String = topTexts.removeFirst()
        topTexts.append(topText)
 
        withHeightSVs.forEach { sv in
            if let v = sv.arrangedSubviews.first as? UILabel {
                v.text = topText
            }
        }
        noHeightSVs.forEach { sv in
            if let v = sv.arrangedSubviews.first as? UILabel {
                v.text = topText
            }
        }
    }
    
}
 

Comments

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

    0 B

    |

    👍

    /

    👎

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

    0 B

    |

    👍

    /

    👎

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

    0 B

    |

    👍

    /

    👎