// // ViewController.swift // demo // // Created by azun on 6/8/25. // import UIKit class ViewController: UIViewController { @IBOutlet weak var navBar: UINavigationBar! private let actionButton: UIButton = { let button = UIButton(type: .custom) button.configuration = .clearGlass() button.setTitle("UIButton", for: .normal) button.setTitleColor(.red, for: .normal) button.titleLabel?.font = UIFont.systemFont(ofSize: 18, weight: .semibold) button.translatesAutoresizingMaskIntoConstraints = false return button }() private let toggleButton: UIButton = { let button = UIButton(type: .custom) button.configuration = .clearGlass() button.setTitle("Disable some buttons", for: .normal) button.setTitleColor(.blue, for: .normal) button.titleLabel?.font = UIFont.systemFont(ofSize: 20, weight: .semibold) button.translatesAutoresizingMaskIntoConstraints = false return button }() private let pencilButton = UIBarButtonItem(image: UIImage(systemName: "pencil.tip.crop.circle"), style: .plain, target: nil, action: #selector(buttonTapped)) private lazy var pencilLabel: UILabel = makeLabel(for: pencilButton) private lazy var eraserLabel: UILabel = makeLabel(for: eraserButton) private lazy var trashLabel: UILabel = makeLabel(for: trashButton) private let eraserButton: UIBarButtonItem = { let button = UIBarButtonItem(image: UIImage(systemName: "eraser.fill"), style: .prominent, target: nil, action: #selector(buttonTapped)) button.tintColor = .red return button }() private let trashButton: UIBarButtonItem = { let button = UIBarButtonItem(image: UIImage(systemName: "trash.fill"), style: .prominent, target: nil, action: #selector(buttonTapped)) button.tintColor = .red return button }() private lazy var toolbar1 = makeToolbarWith(barButton: pencilButton) private lazy var toolbar2 = makeToolbarWith(barButton: eraserButton) private lazy var toolbar3 = makeToolbarWith(barButton: trashButton) override func viewDidLoad() { super.viewDidLoad() setupUI() setupGradientBackground() } private func setupUI() { view.addSubview(toolbar1) view.addSubview(toolbar2) view.addSubview(toolbar3) view.addSubview(pencilLabel) view.addSubview(eraserLabel) view.addSubview(trashLabel) view.addSubview(actionButton) actionButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) view.addSubview(toggleButton) toggleButton.addTarget(self, action: #selector(toggleButtonTapped), for: .touchUpInside) // Center the button using Auto Layout NSLayoutConstraint.activate([ toolbar1.topAnchor.constraint(equalTo: navBar.bottomAnchor, constant: 44), toolbar1.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10), toolbar1.widthAnchor.constraint(equalToConstant: 100), pencilLabel.leadingAnchor.constraint(equalTo: toolbar1.trailingAnchor, constant: 10), pencilLabel.centerYAnchor.constraint(equalTo: toolbar1.centerYAnchor), pencilLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10), toolbar2.topAnchor.constraint(equalTo: toolbar1.bottomAnchor, constant: 44), toolbar2.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10), toolbar2.widthAnchor.constraint(equalToConstant: 100), eraserLabel.leadingAnchor.constraint(equalTo: toolbar2.trailingAnchor, constant: 10), eraserLabel.centerYAnchor.constraint(equalTo: toolbar2.centerYAnchor), eraserLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10), toolbar3.topAnchor.constraint(equalTo: toolbar2.bottomAnchor, constant: 44), toolbar3.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10), toolbar3.widthAnchor.constraint(equalToConstant: 100), trashLabel.leadingAnchor.constraint(equalTo: toolbar3.trailingAnchor, constant: 10), trashLabel.centerYAnchor.constraint(equalTo: toolbar3.centerYAnchor), trashLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10), actionButton.topAnchor.constraint(equalTo: toolbar3.bottomAnchor, constant: 44), actionButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), actionButton.heightAnchor.constraint(equalToConstant: 44), toggleButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), toggleButton.topAnchor.constraint(equalTo: actionButton.bottomAnchor, constant: 44), toggleButton.heightAnchor.constraint(equalToConstant: 44), ]) } @objc private func buttonTapped(sender: Any) { toggleButtonTapped() } @objc private func toggleButtonTapped() { actionButton.isEnabled.toggle() pencilButton.isEnabled.toggle() pencilButton.hidesSharedBackground = false pencilLabel.text = Self.genText(for: pencilButton) eraserButton.isEnabled.toggle() eraserButton.hidesSharedBackground = false eraserLabel.text = Self.genText(for: eraserButton) trashButton.isEnabled.toggle() trashButton.hidesSharedBackground = !trashButton.isEnabled trashLabel.text = Self.genText(for: trashButton) toggleButton.setTitle(actionButton.isEnabled ? "Disable some buttons" : "Enable them", for: .normal) } } private extension ViewController { func makeToolbarWith(barButton: UIBarButtonItem) -> UIToolbar { let toolbar = UIToolbar() toolbar.barStyle = .default toolbar.layer.cornerRadius = 22 toolbar.backgroundColor = .systemCyan.withAlphaComponent(0.3) toolbar.translatesAutoresizingMaskIntoConstraints = false toolbar.items = [ UIBarButtonItem.flexibleSpace(), barButton, UIBarButtonItem.flexibleSpace() ] return toolbar } func makeLabel(for barButton: UIBarButtonItem) -> UILabel { let label = UILabel() label.numberOfLines = 0 label.translatesAutoresizingMaskIntoConstraints = false label.text = Self.genText(for: barButton) label.font = UIFont.systemFont(ofSize: 18, weight: .regular) label.textAlignment = .left label.textColor = .white return label } static func genText(for button: UIBarButtonItem) -> String { " style:\(button.style.name) \n isEnabled:\(button.isEnabled) \n hidesSharedBackground:\(button.hidesSharedBackground)" } func setupGradientBackground() { // Create gradient layer let gradientLayer = CAGradientLayer() // Set gradient frame to match view bounds gradientLayer.frame = view.bounds // Define gradient colors let startColor = UIColor(red: 0.2, green: 0.4, blue: 0.3, alpha: 1.0).cgColor let endColor = UIColor(red: 0.5, green: 0.2, blue: 0.1, alpha: 1.0).cgColor gradientLayer.colors = [startColor, endColor] // Set gradient direction (top-left to bottom-right) gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0) gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0) // Insert gradient layer at the bottom of the view's layer stack view.layer.insertSublayer(gradientLayer, at: 0) } } extension UIBarButtonItem.Style { var name: String { switch self { case .plain: return "plain" case .done: return "done" case .prominent: return "prominent" case .bordered: return "bordered" @unknown default: return "unknown" } } }