diff --git a/WordPress/Classes/ViewRelated/Reader/Detail/ReaderDetailCoordinator.swift b/WordPress/Classes/ViewRelated/Reader/Detail/ReaderDetailCoordinator.swift index 45471e63708a..16b88be2b866 100644 --- a/WordPress/Classes/ViewRelated/Reader/Detail/ReaderDetailCoordinator.swift +++ b/WordPress/Classes/ViewRelated/Reader/Detail/ReaderDetailCoordinator.swift @@ -534,20 +534,6 @@ class ReaderDetailCoordinator { scrollToHashIfNeeded() } - /// Show the featured image fullscreen - /// - private func showFeaturedImage(_ sender: AsyncImageView) { - guard let post, let imageURL = post.featuredImage.flatMap(URL.init) else { - return - } - let lightboxVC = LightboxViewController(sourceURL: imageURL, host: MediaHost(post)) - MainActor.assumeIsolated { - lightboxVC.thumbnail = sender.image - } - lightboxVC.configureZoomTransition(sourceView: sender) - viewController?.present(lightboxVC, animated: true) - } - private func followSite(completion: @escaping () -> Void) { guard let post else { return @@ -729,12 +715,6 @@ extension ReaderDetailCoordinator: ReaderDetailHeaderViewDelegate { } -extension ReaderDetailCoordinator: ReaderDetailFeaturedImageViewDelegate { - func didTapFeaturedImage(_ sender: AsyncImageView) { - showFeaturedImage(sender) - } -} - extension ReaderDetailCoordinator: ReaderDetailLikesViewDelegate { func didTapLikesView() { showLikesList() diff --git a/WordPress/Classes/ViewRelated/Reader/Detail/ReaderDetailViewController.storyboard b/WordPress/Classes/ViewRelated/Reader/Detail/ReaderDetailViewController.storyboard index 820e97a89252..3012a436897a 100644 --- a/WordPress/Classes/ViewRelated/Reader/Detail/ReaderDetailViewController.storyboard +++ b/WordPress/Classes/ViewRelated/Reader/Detail/ReaderDetailViewController.storyboard @@ -1,8 +1,8 @@ - + - + @@ -17,7 +17,7 @@ - + @@ -134,7 +134,7 @@ - + @@ -149,7 +149,6 @@ - diff --git a/WordPress/Classes/ViewRelated/Reader/Detail/ReaderDetailViewController.swift b/WordPress/Classes/ViewRelated/Reader/Detail/ReaderDetailViewController.swift index 61b0cc3ec629..e5b58352560c 100644 --- a/WordPress/Classes/ViewRelated/Reader/Detail/ReaderDetailViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/Detail/ReaderDetailViewController.swift @@ -68,23 +68,8 @@ class ReaderDetailViewController: UIViewController, ReaderDetailView { /// Attribution view for Discovery posts @IBOutlet weak var attributionView: ReaderCardDiscoverAttributionView! - @IBOutlet weak var scrollViewTopConstraint: NSLayoutConstraint! - private let activityIndicator = UIActivityIndicatorView(style: .medium) - /// The actual header - private let featuredImageView = ReaderDetailFeaturedImageView() - - private var heroView: ReaderHeroView? - - private var isNewFeaturedImageEnabled: Bool { - if #available(iOS 26, *) { - return true - } else { - return false - } - } - /// The actual header private lazy var header = ReaderDetailHeaderHostingView() @@ -128,12 +113,6 @@ class ReaderDetailViewController: UIViewController, ReaderDetailView { } } - var currentPreferredStatusBarStyle = UIStatusBarStyle.lightContent { - didSet { - setNeedsStatusBarAppearanceUpdate() - } - } - override var hidesBottomBarWhenPushed: Bool { set { } get { true } @@ -201,7 +180,6 @@ class ReaderDetailViewController: UIViewController, ReaderDetailView { configureNavigationBar() applyStyles() configureWebView() - configureLegacyFeaturedImage() configureHeader() configureRelatedPosts() configureToolbar() @@ -215,13 +193,6 @@ class ReaderDetailViewController: UIViewController, ReaderDetailView { startObservingPost() - if #available(iOS 26, *) { - scrollViewTopConstraint?.isActive = false - scrollView.pinEdges(.top) - - headerContainerView.clipsToBounds = true - } - // Fixes swipe to go back not working when leftBarButtonItem is set navigationController?.interactivePopGestureRecognizer?.delegate = self @@ -249,18 +220,10 @@ class ReaderDetailViewController: UIViewController, ReaderDetailView { super.viewWillAppear(animated) updateLeftBarButtonItem() - setupFeaturedImage() updateFollowButtonState() toolbar.viewWillAppear() - if #unavailable(iOS 26) { - DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) { - // Workaround for tab bar dismiss iteraction - self.navigationController?.setToolbarHidden(false, animated: animated) - } - } else { - navigationController?.setToolbarHidden(false, animated: animated) - } + navigationController?.setToolbarHidden(false, animated: animated) } override func viewWillDisappear(_ animated: Bool) { @@ -270,23 +233,10 @@ class ReaderDetailViewController: UIViewController, ReaderDetailView { return } - if !isNewFeaturedImageEnabled { - featuredImageView.viewWillDisappear() - } toolbar.viewWillDisappear() navigationController?.setToolbarHidden(true, animated: animated) } - override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { - super.viewWillTransition(to: size, with: coordinator) - - if !isNewFeaturedImageEnabled { - coordinator.animate(alongsideTransition: { _ in - self.featuredImageView.deviceDidRotate() - }) - } - } - override func accessibilityPerformEscape() -> Bool { navigationController?.popViewController(animated: true) return true @@ -296,19 +246,9 @@ class ReaderDetailViewController: UIViewController, ReaderDetailView { scrollView } - override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { - super.traitCollectionDidChange(previousTraitCollection) - - let isCompact = traitCollection.horizontalSizeClass == .compact - headerContainerView.layer.cornerRadius = isCompact ? DesignConstants.radius(.large) : 0 - headerContainerView.layer.maskedCorners = isCompact ? [.layerMaxXMinYCorner, .layerMinXMinYCorner] : [] - } - func render(_ post: ReaderPost) { configureDiscoverAttribution(post) - setupHeroView() - featuredImageView.configure(for: post, with: self) toolbar.configure(for: post, in: self) updateToolbarItems() header.configure(for: post) @@ -328,10 +268,6 @@ class ReaderDetailViewController: UIViewController, ReaderDetailView { } navigateToCommentIfNecessary() - - if !isNewFeaturedImageEnabled && !featuredImageView.isLoaded { - featuredImageView.load() - } } private func showPostContent(_ post: ReaderPost) { @@ -557,9 +493,6 @@ class ReaderDetailViewController: UIViewController, ReaderDetailView { header.displaySetting = displaySetting } - // Featured image view - featuredImageView.displaySetting = displaySetting - // Update Reader Post web view if let contentForDisplay = post?.contentForDisplay() { webView.displaySetting = displaySetting @@ -615,95 +548,6 @@ class ReaderDetailViewController: UIViewController, ReaderDetailView { } } - private func setupFeaturedImage() { - if isNewFeaturedImageEnabled { - setupHeroView() - } else { - setupLegacyFeaturedImage() - } - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - - layoutHeroView() - } - - private func setupHeroView() { - guard isNewFeaturedImageEnabled else { - return - } - guard let post, let imageURL = post.featuredImageURL, - !post.contentIncludesFeaturedImage() else { - return - } - if heroView == nil { - let heroView = ReaderHeroView() - heroView.configureTapGesture(in: scrollView) { [weak self] in - self?.coordinator?.didTapFeaturedImage($0) - } - view.insertSubview(heroView, belowSubview: scrollView) - self.heroView = heroView - } - if heroView?.imageURL != imageURL { - heroView?.imageURL = imageURL - heroView?.imageView.setImage(with: ImageRequest(url: imageURL, host: MediaHost(post))) - } - layoutHeroView() - } - - private func layoutHeroView() { - guard let heroView else { - return - } - let contentInsetTop = heroView.imageView.frame.height + heroView.estimatedStatusBarOffset - view.safeAreaInsets.top - if contentInsetTop != scrollView.contentInset.top { - // `contentInset` is automatically adjusted to include safeAreaInsets.top - scrollView.contentInset.top = contentInsetTop - } - // DesignConstants.radius(.large) to extend a bit behind the header view - let heroViewFrame = CGRect(x: 0, y: 0, width: view.bounds.width, height: max(0, -scrollView.contentOffset.y + heroView.bottomExtensionHeight)) - if heroViewFrame != heroView.frame { - heroView.frame = heroViewFrame - } - } - - private func setupLegacyFeaturedImage() { - configureLegacyFeaturedImage() - - featuredImageView.configure( - scrollView: scrollView, - navigationBar: navigationController?.navigationBar, - navigationItem: navigationItem - ) - - if !featuredImageView.isLoaded { - featuredImageView.load() - } - } - - private func configureLegacyFeaturedImage() { - guard featuredImageView.superview == nil else { - return - } - - if ReaderDisplaySettings.customizationEnabled { - featuredImageView.displaySetting = displaySetting - } - - featuredImageView.delegate = coordinator - - view.insertSubview(featuredImageView, belowSubview: scrollView) - - NSLayoutConstraint.activate([ - featuredImageView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0), - featuredImageView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0), - featuredImageView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0) - ]) - - headerContainerView.translatesAutoresizingMaskIntoConstraints = false - } - private func configureHeader() { header.displaySetting = displaySetting header.delegate = coordinator @@ -1072,7 +916,6 @@ extension ReaderDetailViewController: UIScrollViewDelegate { toolbarHiddenDebouncer.send(false) // Scrolling up } lastContentOffset = currentOffset - layoutHeroView() } private func setNeedsToolbarHidden(_ isHidden: Bool) { @@ -1215,17 +1058,6 @@ extension ReaderDetailViewController: ReaderCardDiscoverAttributionViewDelegate } } -// MARK: - UpdatableStatusBarStyle -extension ReaderDetailViewController: UpdatableStatusBarStyle { - func updateStatusBarStyle(to style: UIStatusBarStyle) { - guard style != currentPreferredStatusBarStyle else { - return - } - - currentPreferredStatusBarStyle = style - } -} - // MARK: - Transitioning Delegate extension ReaderDetailViewController: UIViewControllerTransitioningDelegate { diff --git a/WordPress/Classes/ViewRelated/Reader/Detail/Views/ReaderHeroView.swift b/WordPress/Classes/ViewRelated/Reader/Detail/Views/ReaderHeroView.swift deleted file mode 100644 index d5a8f6ef0dff..000000000000 --- a/WordPress/Classes/ViewRelated/Reader/Detail/Views/ReaderHeroView.swift +++ /dev/null @@ -1,97 +0,0 @@ -import Foundation -import AsyncImageKit -import WordPressUI - -final class ReaderHeroView: UIView { - let imageView = AsyncImageView() - - private var extensionView: UIView? - - // Make sure the image doesn't go below the status bar - var estimatedStatusBarOffset: CGFloat { - traitCollection.horizontalSizeClass == .compact ? 40 : 20 - } - - private(set) var bottomExtensionHeight: CGFloat = 0 - - var imageURL: URL? - - private var onTap: ((AsyncImageView) -> Void)? - - override init(frame: CGRect) { - super.init(frame: frame) - - if #available(iOS 26.0, *) { - let extensionView = UIBackgroundExtensionView() - extensionView.automaticallyPlacesContentView = false - extensionView.contentView = imageView - self.extensionView = extensionView - - addSubview(extensionView) - } else { - addSubview(imageView) - } - - clipsToBounds = true - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func layoutSubviews() { - super.layoutSubviews() - - extensionView?.frame = bounds - - // Enforce the default aspect ratio - let height = min(280, bounds.width * ReaderPostCell.coverAspectRatio).rounded() - - // Center the image in the container to achieve the parallax effect - let imageViewFrame = CGRect( - x: 0, - // rounded is needed to avoid gaps in the extension view - y: ((bounds.height - height) / 2 + estimatedStatusBarOffset - bottomExtensionHeight).rounded(), - width: bounds.width, - height: height - ) - - if imageViewFrame != imageView.frame { - imageView.frame = imageViewFrame - } - } - - override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { - super.traitCollectionDidChange(previousTraitCollection) - - // Extend below the header of the article to support corner radius - let newValue = traitCollection.horizontalSizeClass == .compact ? DesignConstants.radius(.large) : 0 - if bottomExtensionHeight != newValue { - bottomExtensionHeight = newValue - setNeedsLayout() - } - } - - func configureTapGesture(in scrollView: UIScrollView, _ closure: @escaping (AsyncImageView) -> Void) { - let tap = UITapGestureRecognizer(target: self, action: #selector(didTap)) - tap.cancelsTouchesInView = false - tap.delegate = self - scrollView.addGestureRecognizer(tap) - - self.onTap = closure - } - - @objc private func didTap() { - onTap?(imageView) - } -} - -extension ReaderHeroView: UIGestureRecognizerDelegate { - func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { - let touchPoint = touch.location(in: self) - let isOutsideView = !imageView.frame.contains(touchPoint) - - /// Do not accept the touch if outside the featured image view - return isOutsideView == false - } -}