From b32a1d50760a573b887ca494dc85829f713c98ad Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Thu, 3 May 2018 13:53:40 -0400 Subject: [PATCH] Fix media page title view on iOS9/10 We must specify the frame of the titleView Previously the titleView was the stackview, but we don't want to "stretch" the labels to fit the size of the stack view, so we wrap the stack view in a container view which becomes the new titleView. // FREEBIE --- .../MediaPageViewController.swift | 42 +++++++++++++++---- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/Signal/src/ViewControllers/MediaPageViewController.swift b/Signal/src/ViewControllers/MediaPageViewController.swift index f0790ab37..37542fc05 100644 --- a/Signal/src/ViewControllers/MediaPageViewController.swift +++ b/Signal/src/ViewControllers/MediaPageViewController.swift @@ -67,7 +67,7 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou private let showAllMediaButton: Bool private let sliderEnabled: Bool - private let headerView: UIStackView + private let headerView: UIView init(initialItem: MediaGalleryItem, mediaGalleryDataSource: MediaGalleryDataSource, uiDatabaseConnection: YapDatabaseConnection, options: MediaGalleryOption) { assert(uiDatabaseConnection.isInLongLivedReadTransaction()) @@ -78,20 +78,29 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou let kSpacingBetweenItems: CGFloat = 20 - let headerView = UIStackView() - self.headerView = headerView + self.headerView = UIView() + headerView.layoutMargins = UIEdgeInsets(top: 2, left: 8, bottom: 4, right: 8) super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: [UIPageViewControllerOptionInterPageSpacingKey: kSpacingBetweenItems]) - // needed for proper layout on iOS9/10 - headerView.translatesAutoresizingMaskIntoConstraints = false + let headerStackView = UIStackView() + headerView.addSubview(headerStackView) - headerView.axis = .vertical - headerView.alignment = .center - headerView.addArrangedSubview(headerNameLabel) - headerView.addArrangedSubview(headerDateLabel) + 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 @@ -589,6 +598,7 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou label.font = UIFont.ows_regularFont(withSize: 12) label.textAlignment = .center label.adjustsFontSizeToFitWidth = true + label.minimumScaleFactor = 0.8 return label }() @@ -609,5 +619,19 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou let date = Date(timeIntervalSince1970: Double(item.message.timestamp) / 1000) let formattedDate = dateFormatter.string(from: date) headerDateLabel.text = formattedDate + + if #available(iOS 11, *) { + // 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) + + let headerFrame: CGRect = CGRect(x: 0, y: 0, width: maxWidth, height: 44) + headerView.frame = headerFrame + } } }