implement dropdowns properly with stackviews

This commit is contained in:
2025-07-08 14:57:31 +02:00
parent e91b53f569
commit f987e88f24
2 changed files with 83 additions and 59 deletions

View File

@@ -136,51 +136,68 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
}
func setupBackgroundColorDropdown() {
// TODO: Find out how to acutally do UI and dropdowns with StackView
backgroundColorDropdownButton.setTitle("Background color ▼", for: .normal)
backgroundColorDropdownButton.setTitleColor(.white, for: .normal)
backgroundColorDropdownButton.isHidden = true
backgroundColorDropdownButton.translatesAutoresizingMaskIntoConstraints = false
topBarView.addSubview(backgroundColorDropdownButton)
NSLayoutConstraint.activate([
backgroundColorDropdownButton.trailingAnchor.constraint(
equalTo: topBarView.leadingAnchor, constant: 180),
backgroundColorDropdownButton.centerYAnchor.constraint(
equalTo: topBarView.centerYAnchor),
])
backgroundColorDropdownButton.addTarget(
self, action: #selector(toggleBackgroundColorDropdown), for: .touchUpInside)
self, action: #selector(toggleBackgroundColorDropdown), for: .touchDown)
backgroundColorDropdownView.backgroundColor = UIColor.darkGray
backgroundColorDropdownView.translatesAutoresizingMaskIntoConstraints = false
backgroundColorDropdownView.isHidden = true
backgroundColorDropdownButton.addSubview(backgroundColorDropdownView)
view.addSubview(backgroundColorDropdownView)
let stackView = UIStackView()
stackView.axis = .vertical
stackView.spacing = 0
stackView.distribution = .fillEqually // All buttons same height
stackView.spacing = 8
stackView.distribution = .fillEqually
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.isLayoutMarginsRelativeArrangement = true
stackView.layoutMargins = UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0)
backgroundColorDropdownView.addSubview(stackView)
NSLayoutConstraint.activate([
stackView.topAnchor.constraint(equalTo: backgroundColorDropdownView.topAnchor, constant: 32),
stackView.bottomAnchor.constraint(equalTo: backgroundColorDropdownView.bottomAnchor),
stackView.leadingAnchor.constraint(equalTo: backgroundColorDropdownView.leadingAnchor),
stackView.trailingAnchor.constraint(equalTo: backgroundColorDropdownView.trailingAnchor),
])
let titles = ["Option 1", "Option 2", "Option 3"]
for title in titles {
let colorOptions = ["White", "Gray", "Black", "Red", "Blue"]
for title in colorOptions {
let button = UIButton(type: .system)
button.setTitle(title, for: .normal)
button.setTitleColor(.white, for: .normal)
button.contentHorizontalAlignment = .left
button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0)
button.backgroundColor = .clear
button.addTarget(self, action: #selector(handleBackgroundColorOption(_:)), for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false
button.addTarget(
self, action: #selector(handleBackgroundColorOption), for: .touchDown)
stackView.addArrangedSubview(button)
}
NSLayoutConstraint.activate([
backgroundColorDropdownButton.leadingAnchor.constraint(
equalTo: topBarView.leadingAnchor, constant: 32),
backgroundColorDropdownButton.centerYAnchor.constraint(
equalTo: topBarView.centerYAnchor),
backgroundColorDropdownButton.topAnchor.constraint(
equalTo: topBarView.topAnchor),
backgroundColorDropdownButton.bottomAnchor.constraint(
equalTo: topBarView.bottomAnchor),
backgroundColorDropdownView.topAnchor.constraint(
equalTo: backgroundColorDropdownButton.bottomAnchor),
backgroundColorDropdownView.leadingAnchor.constraint(
equalTo: backgroundColorDropdownButton.leadingAnchor),
backgroundColorDropdownView.trailingAnchor.constraint(
equalTo: backgroundColorDropdownButton.trailingAnchor),
stackView.topAnchor.constraint(
equalTo: backgroundColorDropdownView.topAnchor),
stackView.bottomAnchor.constraint(equalTo: backgroundColorDropdownView.bottomAnchor),
stackView.leadingAnchor.constraint(equalTo: backgroundColorDropdownView.leadingAnchor),
stackView.trailingAnchor.constraint(
equalTo: backgroundColorDropdownView.trailingAnchor),
])
}
func setupPageTurnDropdown() {
@@ -190,56 +207,62 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
pageTurnDropdownButton.translatesAutoresizingMaskIntoConstraints = false
topBarView.addSubview(pageTurnDropdownButton)
NSLayoutConstraint.activate([
pageTurnDropdownButton.trailingAnchor.constraint(
equalTo: topBarView.trailingAnchor, constant: -16),
pageTurnDropdownButton.centerYAnchor.constraint(equalTo: topBarView.centerYAnchor),
])
pageTurnDropdownButton.addTarget(
self, action: #selector(togglePageTurnDropdown), for: .touchUpInside)
self, action: #selector(togglePageTurnDropdown), for: .touchDown)
pageTurnDropdownView.backgroundColor = UIColor.darkGray
pageTurnDropdownView.translatesAutoresizingMaskIntoConstraints = false
pageTurnDropdownView.isHidden = true
view.addSubview(pageTurnDropdownView)
let stackView = UIStackView()
stackView.axis = .vertical
stackView.spacing = 8
stackView.distribution = .fillEqually
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.isLayoutMarginsRelativeArrangement = true
stackView.layoutMargins = UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0)
pageTurnDropdownView.addSubview(stackView)
let pageTurnOptions = ["Left to right", "Right to left", "Scroll"]
var options: [UIButton] = []
for option in pageTurnOptions {
for title in pageTurnOptions {
let button = UIButton(type: .system)
button.setTitle(option, for: .normal)
button.setTitle(title, for: .normal)
button.setTitleColor(.white, for: .normal)
button.addTarget(self, action: #selector(handlePageTurnOption), for: .touchUpInside)
button.contentHorizontalAlignment = .left
button.backgroundColor = .clear
button.translatesAutoresizingMaskIntoConstraints = false
pageTurnDropdownView.addSubview(button)
options.append(button)
button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0)
button.addTarget(
self, action: #selector(handlePageTurnOption), for: .touchDown)
stackView.addArrangedSubview(button)
}
var constraints = [
pageTurnDropdownView.topAnchor.constraint(equalTo: topBarView.bottomAnchor),
pageTurnDropdownView.trailingAnchor.constraint(equalTo: topBarView.trailingAnchor),
pageTurnDropdownView.widthAnchor.constraint(equalToConstant: 150),
pageTurnDropdownView.heightAnchor.constraint(
equalToConstant: CGFloat(options.count) * 32),
]
NSLayoutConstraint.activate([
pageTurnDropdownButton.trailingAnchor.constraint(
equalTo: topBarView.trailingAnchor, constant: -32),
pageTurnDropdownButton.centerYAnchor.constraint(
equalTo: topBarView.centerYAnchor),
pageTurnDropdownButton.topAnchor.constraint(
equalTo: topBarView.topAnchor),
pageTurnDropdownButton.bottomAnchor.constraint(
equalTo: topBarView.bottomAnchor),
for i in 0...options.count - 1 {
constraints.append(
options[i].topAnchor.constraint(
equalTo: pageTurnDropdownView.topAnchor, constant: CGFloat(i) * 32))
constraints.append(
options[i].leadingAnchor.constraint(
equalTo: pageTurnDropdownView.leadingAnchor, constant: 8))
constraints.append(
options[i].trailingAnchor.constraint(equalTo: pageTurnDropdownView.trailingAnchor))
constraints.append(options[i].heightAnchor.constraint(equalToConstant: 32))
}
pageTurnDropdownView.topAnchor.constraint(
equalTo: pageTurnDropdownButton.bottomAnchor),
pageTurnDropdownView.leadingAnchor.constraint(
equalTo: pageTurnDropdownButton.leadingAnchor),
pageTurnDropdownView.trailingAnchor.constraint(
equalTo: pageTurnDropdownButton.trailingAnchor),
stackView.topAnchor.constraint(
equalTo: pageTurnDropdownView.topAnchor),
stackView.bottomAnchor.constraint(equalTo: pageTurnDropdownView.bottomAnchor),
stackView.leadingAnchor.constraint(equalTo: pageTurnDropdownView.leadingAnchor),
stackView.trailingAnchor.constraint(
equalTo: pageTurnDropdownView.trailingAnchor),
])
NSLayoutConstraint.activate(constraints)
}
@objc func handlePageTurnOption(_ sender: UIButton) {
@@ -291,7 +314,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
func toggleTopBar() {
topBarView.isHidden.toggle()
topBarHeightConstraint.constant = !topBarView.isHidden ? 60 : 0 // You can adjust height
topBarHeightConstraint.constant = !topBarView.isHidden ? 64 : 0 // You can adjust height
topBarLabel.isHidden = topBarView.isHidden
pageTurnDropdownButton.isHidden = topBarView.isHidden
@@ -299,7 +322,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
if topBarView.isHidden {
pageTurnDropdownView.isHidden = true
backgroundColorDropdownButton.isHidden = true
backgroundColorDropdownView.isHidden = true
}
}

1
run.sh
View File

@@ -19,6 +19,7 @@ xcodebuild -scheme "$SCHEME" -derivedDataPath "$DERIVED_DATA" -destination "plat
# Install and launch
APP_PATH="$DERIVED_DATA/Build/Products/Debug-iphonesimulator/$APP_NAME.app"
xcrun simctl install booted "$APP_PATH"
xcrun simctl spawn booted log stream --predicate 'process == "ImageViewer"' --style syslog &
xcrun simctl launch booted "$COMPANY.$APP_NAME"
sudo sed -i '' '/developerservices2\.apple\.com/d' /etc/hosts