Skip to content

Commit

Permalink
Improve landscape-view for QR-code (#2276)
Browse files Browse the repository at this point in the history
It's scrollable!
  • Loading branch information
zeitschlag committed Sep 4, 2024
1 parent c99a9a9 commit ee9c55c
Showing 1 changed file with 45 additions and 8 deletions.
53 changes: 45 additions & 8 deletions deltachat-ios/Controller/QrViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,15 @@ class QrViewController: UIViewController {
private let dcContext: DcContext

private let contentStackView: UIStackView

private let contentScrollView: UIScrollView
private let qrContentView: UIImageView
private let shareLinkButton: UIButton

private let moreButton: UIBarButtonItem

var verticalCenterConstraint: NSLayoutConstraint?
var contentTopAnchor: NSLayoutConstraint?
var contentBottomAnchor: NSLayoutConstraint?

var qrCodeHint: String {
willSet {
let svg = dcContext.getSecurejoinQrSVG(chatId: chatId)
Expand All @@ -36,12 +39,16 @@ class QrViewController: UIViewController {
shareLinkButton.setTitle("Share Invite Link", for: .normal)
shareLinkButton.translatesAutoresizingMaskIntoConstraints = false

contentStackView = UIStackView(arrangedSubviews: [qrContentView, shareLinkButton])
contentStackView = UIStackView(arrangedSubviews: [qrContentView, shareLinkButton, UIView()])
contentStackView.translatesAutoresizingMaskIntoConstraints = false
contentStackView.axis = .vertical
contentStackView.alignment = .center
contentStackView.spacing = 16

contentScrollView = UIScrollView()
contentScrollView.translatesAutoresizingMaskIntoConstraints = false
contentScrollView.addSubview(contentStackView)

let moreButtonImage: UIImage?
if #available(iOS 13.0, *) {
moreButtonImage = UIImage(systemName: "ellipsis.circle")
Expand All @@ -65,7 +72,7 @@ class QrViewController: UIViewController {
let svg = dcContext.getSecurejoinQrSVG(chatId: chatId)
qrContentView.image = getQrImage(svg: svg)

view.addSubview(contentStackView)
view.addSubview(contentScrollView)

setupConstraints()
}
Expand All @@ -81,20 +88,51 @@ class QrViewController: UIViewController {
qrImageRatio = 1
}

verticalCenterConstraint = contentStackView.centerYAnchor.constraint(equalTo: contentScrollView.centerYAnchor)
contentTopAnchor = contentStackView.topAnchor.constraint(equalTo: contentScrollView.topAnchor, constant: 16)
contentBottomAnchor = contentScrollView.bottomAnchor.constraint(equalTo: contentStackView.bottomAnchor, constant: 16)

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),

contentStackView.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor),
contentStackView.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor),
contentScrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
contentScrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
view.safeAreaLayoutGuide.trailingAnchor.constraint(equalTo: contentScrollView.trailingAnchor),
view.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: contentScrollView.bottomAnchor),

contentStackView.leadingAnchor.constraint(equalTo: contentScrollView.leadingAnchor),
contentScrollView.trailingAnchor.constraint(equalTo: contentStackView.trailingAnchor),

contentStackView.centerXAnchor.constraint(equalTo: contentScrollView.centerXAnchor),
]

traitCollectionDidChange(traitCollection)
NSLayoutConstraint.activate(constraints)
}

// MARK: - lifecycle
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
let orientation = UIApplication.shared.statusBarOrientation

switch orientation {
case .portrait, .portraitUpsideDown:
verticalCenterConstraint?.isActive = true
contentTopAnchor?.isActive = false
contentBottomAnchor?.isActive = false
case .landscapeLeft, .landscapeRight:
verticalCenterConstraint?.isActive = false
contentTopAnchor?.isActive = true
contentBottomAnchor?.isActive = true
case .unknown:
// do nothing
break
@unknown default:
break
}
}

// MARK: - lifecycle
func getQrImage(svg: String?) -> UIImage? {
guard let svg else { return nil }

Expand All @@ -110,7 +148,6 @@ class QrViewController: UIViewController {
Utils.share(url: inviteLinkURL, parentViewController: self, sourceView: sender)
}


// 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)
Expand Down

0 comments on commit ee9c55c

Please sign in to comment.