From 798b2704badc0f84b69edc7e77200c2da16c2586 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sat, 31 Aug 2024 14:28:00 +0200 Subject: [PATCH] Cleanup and refactorings (#2276) Also: Fix constraints and correctly set height for QR-code-image. --- .../Controller/QrViewController.swift | 116 ++++++++++-------- 1 file changed, 65 insertions(+), 51 deletions(-) diff --git a/deltachat-ios/Controller/QrViewController.swift b/deltachat-ios/Controller/QrViewController.swift index 952fe3522..0117917b7 100644 --- a/deltachat-ios/Controller/QrViewController.swift +++ b/deltachat-ios/Controller/QrViewController.swift @@ -7,25 +7,9 @@ class QrViewController: UIViewController { private let dcContext: DcContext var onDismissed: (() -> Void)? - - private lazy var qrContentView: UIImageView = { - let svg = dcContext.getSecurejoinQrSVG(chatId: chatId) - let view = UIImageView() - view.contentMode = .scaleAspectFit - view.translatesAutoresizingMaskIntoConstraints = false - view.image = getQrImage(svg: svg) - return view - }() - - private lazy var moreButton: UIBarButtonItem = { - let image: UIImage? - if #available(iOS 13.0, *) { - image = UIImage(systemName: "ellipsis.circle") - } else { - image = UIImage(named: "ic_more") - } - return UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(showMoreOptions)) - }() + private let qrContentView: UIImageView + + private let moreButton: UIBarButtonItem var qrCodeHint: String { willSet { @@ -36,54 +20,84 @@ class QrViewController: UIViewController { } private let chatId: Int - init(dcContext: DcContext, chatId: Int? = 0, qrCodeHint: String?) { + init(dcContext: DcContext, chatId: Int = 0, qrCodeHint: String = "") { self.dcContext = dcContext - self.chatId = chatId ?? 0 - self.qrCodeHint = qrCodeHint ?? "" + self.chatId = chatId + self.qrCodeHint = qrCodeHint + + qrContentView = UIImageView() + qrContentView.contentMode = .scaleAspectFit + qrContentView.translatesAutoresizingMaskIntoConstraints = false + + let moreButtonImage: UIImage? + if #available(iOS 13.0, *) { + moreButtonImage = UIImage(systemName: "ellipsis.circle") + } else { + moreButtonImage = UIImage(named: "ic_more") + } + + moreButton = UIBarButtonItem(image: moreButtonImage, style: .plain, target: nil, action: nil) + super.init(nibName: nil, bundle: nil) - } - required init?(coder _: NSCoder) { - fatalError("init(coder:) has not been implemented") - } + view.backgroundColor = DcColors.defaultBackgroundColor - // MARK: - lifecycle - override func viewDidLoad() { - super.viewDidLoad() title = String.localized("qrshow_title") - setupSubviews() - view.backgroundColor = DcColors.defaultBackgroundColor navigationItem.rightBarButtonItem = moreButton + moreButton.action = #selector(QrViewController.showMoreOptions(_:)) + moreButton.target = self + + let svg = dcContext.getSecurejoinQrSVG(chatId: chatId) + qrContentView.image = getQrImage(svg: svg) + qrContentView.backgroundColor = .yellow + + view.addSubview(qrContentView) + + setupConstraints() + } + + required init?(coder _: NSCoder) { fatalError("init(coder:) has not been implemented") } + + private func setupConstraints() { + + // TODO: Calculate qrContentView.height based on width-constraint and image-ratio. + + let qrImageRatio: CGFloat + if let image = qrContentView.image { + qrImageRatio = image.size.height / image.size.width + } else { + qrImageRatio = 1 + } + + let constraints = [ + qrContentView.widthAnchor.constraint(lessThanOrEqualTo: view.safeAreaLayoutGuide.widthAnchor, multiplier: 0.75), + qrContentView.widthAnchor.constraint(lessThanOrEqualToConstant: 260), + qrContentView.heightAnchor.constraint(equalTo: qrContentView.widthAnchor, multiplier: qrImageRatio), + qrContentView.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor), + qrContentView.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor), + ] + + NSLayoutConstraint.activate(constraints) } + // MARK: - lifecycle + override func viewDidDisappear(_ animated: Bool) { onDismissed?() } - // MARK: - setup - private func setupSubviews() { - view.addSubview(qrContentView) - let qrDefaultWidth = qrContentView.widthAnchor.constraint(equalTo: view.safeAreaLayoutGuide.widthAnchor, multiplier: 0.75) - qrDefaultWidth.priority = UILayoutPriority(500) - qrDefaultWidth.isActive = true - let qrMinWidth = qrContentView.widthAnchor.constraint(lessThanOrEqualToConstant: 260) - qrMinWidth.priority = UILayoutPriority(999) - qrMinWidth.isActive = true - qrContentView.heightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.heightAnchor, multiplier: 1.05).isActive = true - qrContentView.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor).isActive = true - qrContentView.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor).isActive = true - } - func getQrImage(svg: String?) -> UIImage? { - if let svg = svg { - let svgData = svg.data(using: .utf8) - return SDImageSVGKCoder.shared.decodedImage(with: svgData, options: [:]) - } - return nil + guard let svg else { return nil } + + let svgData = svg.data(using: .utf8) + let image = SDImageSVGKCoder.shared.decodedImage(with: svgData, options: [:]) + return image } // MARK: - actions - @objc private func showMoreOptions() { + + // Only relevant for GroupChatDetails, for QR-Code-Tab, this gets handled by QrPageController + @objc private func showMoreOptions(_ sender: Any) { let alert = UIAlertController(title: String.localized("qrshow_title"), message: nil, preferredStyle: .safeActionSheet) alert.addAction(UIAlertAction(title: String.localized("menu_share"), style: .default, handler: share(_:))) alert.addAction(UIAlertAction(title: String.localized("menu_copy_to_clipboard"), style: .default, handler: copyToClipboard(_:)))