From f987e88f2487679356a8eb93594608172fb001aa Mon Sep 17 00:00:00 2001 From: Vegard Matthey Date: Tue, 8 Jul 2025 14:57:31 +0200 Subject: [PATCH] implement dropdowns properly with stackviews --- ImageViewer/ViewController.swift | 141 ++++++++++++++++++------------- run.sh | 1 + 2 files changed, 83 insertions(+), 59 deletions(-) diff --git a/ImageViewer/ViewController.swift b/ImageViewer/ViewController.swift index 5ae4dbf..8989663 100644 --- a/ImageViewer/ViewController.swift +++ b/ImageViewer/ViewController.swift @@ -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 } } diff --git a/run.sh b/run.sh index 442b153..a7c00b6 100755 --- a/run.sh +++ b/run.sh @@ -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