From e91b53f56977675f1d6869735b9e0057b1bf756b Mon Sep 17 00:00:00 2001 From: Vegard Matthey Date: Mon, 7 Jul 2025 23:55:16 +0200 Subject: [PATCH] add dropdowns for page turning mode and background color --- ImageViewer/ViewController.swift | 183 ++++++++++++++++++++++++++++++- 1 file changed, 177 insertions(+), 6 deletions(-) diff --git a/ImageViewer/ViewController.swift b/ImageViewer/ViewController.swift index 8ea95c1..5ae4dbf 100644 --- a/ImageViewer/ViewController.swift +++ b/ImageViewer/ViewController.swift @@ -17,17 +17,25 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { var images: [UIImage] = [] var page = 0 var mode = PageTurnMode.leftToRight + var leftTap: UITapGestureRecognizer! var rightTap: UITapGestureRecognizer! var topTap: UITapGestureRecognizer! + let topBarView = UIView() - var isTopBarVisible = false + let topBarLabel = UILabel() var topBarHeightConstraint: NSLayoutConstraint! + let pageTurnDropdownView = UIView() + let pageTurnDropdownButton = UIButton() + + let backgroundColorDropdownView = UIView() + let backgroundColorDropdownButton = UIButton() + override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .red + view.backgroundColor = .white setup() } @@ -100,6 +108,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { func setupTopBar() { topBarView.translatesAutoresizingMaskIntoConstraints = false topBarView.backgroundColor = UIColor.black.withAlphaComponent(0.8) // Or any style + topBarView.isHidden = true view.addSubview(topBarView) topBarHeightConstraint = topBarView.heightAnchor.constraint(equalToConstant: 0) @@ -110,6 +119,161 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { topBarView.trailingAnchor.constraint(equalTo: view.trailingAnchor), topBarHeightConstraint, ]) + + topBarLabel.text = "Menu" + topBarLabel.textColor = .white + topBarLabel.translatesAutoresizingMaskIntoConstraints = false + topBarLabel.isHidden = true + topBarView.addSubview(topBarLabel) + + NSLayoutConstraint.activate([ + topBarLabel.centerXAnchor.constraint(equalTo: topBarView.centerXAnchor), + topBarLabel.centerYAnchor.constraint(equalTo: topBarView.centerYAnchor), + ]) + + setupBackgroundColorDropdown() + setupPageTurnDropdown() + } + + 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) + + backgroundColorDropdownView.backgroundColor = UIColor.darkGray + backgroundColorDropdownView.translatesAutoresizingMaskIntoConstraints = false + backgroundColorDropdownView.isHidden = true + backgroundColorDropdownButton.addSubview(backgroundColorDropdownView) + + let stackView = UIStackView() + stackView.axis = .vertical + stackView.spacing = 0 + stackView.distribution = .fillEqually // All buttons same height + stackView.translatesAutoresizingMaskIntoConstraints = false + 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 button = UIButton(type: .system) + button.setTitle(title, for: .normal) + button.setTitleColor(.white, for: .normal) + button.backgroundColor = .clear + button.addTarget(self, action: #selector(handleBackgroundColorOption(_:)), for: .touchUpInside) + stackView.addArrangedSubview(button) + } + } + + func setupPageTurnDropdown() { + pageTurnDropdownButton.setTitle("Page Turn Mode ▼", for: .normal) + pageTurnDropdownButton.setTitleColor(.white, for: .normal) + pageTurnDropdownButton.isHidden = true + 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) + + pageTurnDropdownView.backgroundColor = UIColor.darkGray + pageTurnDropdownView.translatesAutoresizingMaskIntoConstraints = false + pageTurnDropdownView.isHidden = true + view.addSubview(pageTurnDropdownView) + + let pageTurnOptions = ["Left to right", "Right to left", "Scroll"] + + var options: [UIButton] = [] + for option in pageTurnOptions { + let button = UIButton(type: .system) + button.setTitle(option, for: .normal) + button.setTitleColor(.white, for: .normal) + button.addTarget(self, action: #selector(handlePageTurnOption), for: .touchUpInside) + + button.translatesAutoresizingMaskIntoConstraints = false + pageTurnDropdownView.addSubview(button) + + options.append(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), + ] + + 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)) + } + + NSLayoutConstraint.activate(constraints) + } + + @objc func handlePageTurnOption(_ sender: UIButton) { + if let title = sender.currentTitle { + switch title.lowercased() { + case "left to right": mode = .leftToRight + case "right to left": mode = .rightToLeft + case "scroll": mode = .scroll + default: break + } + } + togglePageTurnDropdown() + } + + @objc func handleBackgroundColorOption(_ sender: UIButton) { + if let title = sender.currentTitle { + switch title.lowercased() { + case "white": view.backgroundColor = .white + case "gray": view.backgroundColor = .gray + case "black": view.backgroundColor = .black + case "red": view.backgroundColor = .red + case "blue": view.backgroundColor = .blue + default: break + } + } + toggleBackgroundColorDropdown() + } + + @objc func togglePageTurnDropdown() { + pageTurnDropdownView.isHidden.toggle() + } + + @objc func toggleBackgroundColorDropdown() { + backgroundColorDropdownView.isHidden.toggle() } func gestureRecognizer( @@ -125,9 +289,18 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { } func toggleTopBar() { - isTopBarVisible.toggle() + topBarView.isHidden.toggle() - topBarHeightConstraint.constant = isTopBarVisible ? 60 : 0 // You can adjust height + topBarHeightConstraint.constant = !topBarView.isHidden ? 60 : 0 // You can adjust height + topBarLabel.isHidden = topBarView.isHidden + + pageTurnDropdownButton.isHidden = topBarView.isHidden + backgroundColorDropdownButton.isHidden = topBarView.isHidden + + if topBarView.isHidden { + pageTurnDropdownView.isHidden = true + backgroundColorDropdownButton.isHidden = true + } } @objc func handleTopTap() { @@ -170,9 +343,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate { func setupImageView() { imageView.translatesAutoresizingMaskIntoConstraints = false - imageView.contentMode = UIView.ContentMode.scaleAspectFit - imageView.clipsToBounds = true view.addSubview(imageView)