From f24ef7a0e8010d27ef5b148809aa7667b5a6c7e6 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 30 Oct 2018 19:20:53 -0600 Subject: [PATCH] separate title view for landscape --- .../MediaPageViewController.swift | 82 +++++++++++-------- .../translations/en.lproj/Localizable.strings | 9 +- 2 files changed, 50 insertions(+), 41 deletions(-) diff --git a/Signal/src/ViewControllers/MediaPageViewController.swift b/Signal/src/ViewControllers/MediaPageViewController.swift index 990790a27..6e0eb893f 100644 --- a/Signal/src/ViewControllers/MediaPageViewController.swift +++ b/Signal/src/ViewControllers/MediaPageViewController.swift @@ -68,8 +68,6 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou private let showAllMediaButton: Bool private let sliderEnabled: Bool - private let headerView: UIView - init(initialItem: MediaGalleryItem, mediaGalleryDataSource: MediaGalleryDataSource, uiDatabaseConnection: YapDatabaseConnection, options: MediaGalleryOption) { assert(uiDatabaseConnection.isInLongLivedReadTransaction()) self.uiDatabaseConnection = uiDatabaseConnection @@ -79,30 +77,10 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou let kSpacingBetweenItems: CGFloat = 20 - self.headerView = UIView() - headerView.layoutMargins = UIEdgeInsets(top: 2, left: 8, bottom: 4, right: 8) - super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: [UIPageViewControllerOptionInterPageSpacingKey: kSpacingBetweenItems]) - let headerStackView = UIStackView() - headerView.addSubview(headerStackView) - - headerStackView.axis = .vertical - headerStackView.alignment = .center - headerStackView.spacing = 0 - headerStackView.distribution = .fillProportionally - headerStackView.addArrangedSubview(headerNameLabel) - headerStackView.addArrangedSubview(headerDateLabel) - - headerStackView.autoPinEdge(toSuperviewMargin: .top, relation: .greaterThanOrEqual) - headerStackView.autoPinEdge(toSuperviewMargin: .right, relation: .greaterThanOrEqual) - headerStackView.autoPinEdge(toSuperviewMargin: .bottom, relation: .greaterThanOrEqual) - headerStackView.autoPinEdge(toSuperviewMargin: .left, relation: .greaterThanOrEqual) - headerStackView.setContentHuggingHigh() - headerStackView.autoCenterInSuperview() - self.dataSource = self self.delegate = self @@ -138,7 +116,8 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou let backButton = OWSViewController.createOWSBackButton(withTarget: self, selector: #selector(didPressDismissButton)) self.navigationItem.leftBarButtonItem = backButton - self.navigationItem.titleView = headerView + self.navigationItem.titleView = portraitHeaderView + self.updateTitle() if showAllMediaButton { @@ -164,8 +143,6 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou // one "Page" so the bounce doesn't make sense. pagerScrollView.isScrollEnabled = sliderEnabled - self.title = "Attachment" - // Views let kFooterHeight: CGFloat = 44 @@ -232,6 +209,12 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou self.dismissSelf(animated: true) } + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + let isLandscape = size.width > size.height + self.navigationItem.titleView = isLandscape ? nil : self.portraitHeaderView + } + private var shouldHideToolbars: Bool = false { didSet { if (oldValue == shouldHideToolbars) { @@ -588,7 +571,7 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou return formatter }() - lazy private var headerNameLabel: UILabel = { + lazy private var portraitHeaderNameLabel: UILabel = { let label = UILabel() label.textColor = Theme.navbarTitleColor label.font = UIFont.ows_regularFont(withSize: 17) @@ -599,7 +582,7 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou return label }() - lazy private var headerDateLabel: UILabel = { + lazy private var portraitHeaderDateLabel: UILabel = { let label = UILabel() label.textColor = Theme.navbarTitleColor label.font = UIFont.ows_regularFont(withSize: 12) @@ -610,6 +593,30 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou return label }() + private lazy var portraitHeaderView: UIView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.alignment = .center + stackView.spacing = 0 + stackView.distribution = .fillProportionally + stackView.addArrangedSubview(portraitHeaderNameLabel) + stackView.addArrangedSubview(portraitHeaderDateLabel) + + let containerView = UIView() + containerView.layoutMargins = UIEdgeInsets(top: 2, left: 8, bottom: 4, right: 8) + + containerView.addSubview(stackView) + + stackView.autoPinEdge(toSuperviewMargin: .top, relation: .greaterThanOrEqual) + stackView.autoPinEdge(toSuperviewMargin: .trailing, relation: .greaterThanOrEqual) + stackView.autoPinEdge(toSuperviewMargin: .bottom, relation: .greaterThanOrEqual) + stackView.autoPinEdge(toSuperviewMargin: .leading, relation: .greaterThanOrEqual) + stackView.setContentHuggingHigh() + stackView.autoCenterInSuperview() + + return containerView + }() + private func updateTitle() { guard let currentItem = self.currentItem else { owsFailDebug("currentItem was unexpectedly nil") @@ -620,25 +627,30 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou private func updateTitle(item: MediaGalleryItem) { let name = senderName(message: item.message) - headerNameLabel.text = name + portraitHeaderNameLabel.text = name // use sent date let date = Date(timeIntervalSince1970: Double(item.message.timestamp) / 1000) let formattedDate = dateFormatter.string(from: date) - headerDateLabel.text = formattedDate + portraitHeaderDateLabel.text = formattedDate + + let landscapeHeaderFormat = NSLocalizedString("MEDIA_GALLERY_LANDSCAPE_TITLE_FORMAT", comment: "embeds {{sender name}} and {{sent datetime}}, e.g. 'Sarah on 10/30/18, 3:29'") + let landscapeHeaderText = String(format: landscapeHeaderFormat, name, formattedDate) + self.title = landscapeHeaderText + self.navigationItem.title = landscapeHeaderText if #available(iOS 11, *) { - // Do nothing, on iOS11, autolayout grows the stack view as necessary. + // Do nothing, on iOS11+, autolayout grows the stack view as necessary. } else { // Size the titleView to be large enough to fit the widest label, // but no larger. If we go for a "full width" label, our title view // will not be centered (since the left and right bar buttons have different widths) - headerNameLabel.sizeToFit() - headerDateLabel.sizeToFit() - let maxWidth = max(headerNameLabel.frame.width, headerDateLabel.frame.width) + portraitHeaderNameLabel.sizeToFit() + portraitHeaderDateLabel.sizeToFit() + let width = max(portraitHeaderNameLabel.frame.width, portraitHeaderDateLabel.frame.width) - let headerFrame: CGRect = CGRect(x: 0, y: 0, width: maxWidth, height: 44) - headerView.frame = headerFrame + let headerFrame: CGRect = CGRect(x: 0, y: 0, width: width, height: 44) + portraitHeaderView.frame = headerFrame } } } diff --git a/Signal/translations/en.lproj/Localizable.strings b/Signal/translations/en.lproj/Localizable.strings index a70f744f0..c54673b3a 100644 --- a/Signal/translations/en.lproj/Localizable.strings +++ b/Signal/translations/en.lproj/Localizable.strings @@ -1008,12 +1008,6 @@ /* Button label for the 'show contact info' button */ "GROUP_MEMBERS_VIEW_CONTACT_INFO" = "Contact Info"; -/* Modal text when removing a group */ -"GROUP_REMOVING" = "Leaving group %@"; - -/* Title of alert indicating that group deletion failed. */ -"GROUP_REMOVING_FAILED" = "Failed to leave group"; - /* No comment provided by engineer. */ "GROUP_TITLE_CHANGED" = "Title is now '%@'. "; @@ -1167,6 +1161,9 @@ /* Confirmation button text to delete selected media message from the gallery */ "MEDIA_GALLERY_DELETE_SINGLE_MESSAGE" = "Delete Message"; +/* embeds {{sender name}} and {{sent date}}, e.g. 'Sarah on 10/30/18, 3:29' */ +"MEDIA_GALLERY_LANDSCAPE_TITLE_FORMAT" = "%@ on %@"; + /* Short sender label for media sent by you */ "MEDIA_GALLERY_SENDER_NAME_YOU" = "You";