From 3847dcb343d24b3f91826e34ab4c8af8f19311d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20=C5=A0vara?= Date: Tue, 16 May 2023 16:50:36 +0200 Subject: [PATCH 1/3] Install refresh control by assigning it to the web view's scroll view. --- Source/Visitable/VisitableView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Visitable/VisitableView.swift b/Source/Visitable/VisitableView.swift index aecede5..b445689 100644 --- a/Source/Visitable/VisitableView.swift +++ b/Source/Visitable/VisitableView.swift @@ -67,13 +67,13 @@ open class VisitableView: UIView { guard let scrollView = webView?.scrollView, allowsPullToRefresh else { return } #if !targetEnvironment(macCatalyst) - scrollView.addSubview(refreshControl) + scrollView.refreshControl = refreshControl #endif } private func removeRefreshControl() { refreshControl.endRefreshing() - refreshControl.removeFromSuperview() + webView?.scrollView.refreshControl = nil } @objc func refresh(_ sender: AnyObject) { From a9c19d7b66b8079c04f9cb8fbaaf38c2a502b7ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20=C5=A0vara?= Date: Wed, 17 May 2023 15:35:29 +0200 Subject: [PATCH 2/3] Explicitly add refresh control as subview of scroll view, and use constraints for its positioning. --- Source/Visitable/VisitableView.swift | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Source/Visitable/VisitableView.swift b/Source/Visitable/VisitableView.swift index b445689..49ca84a 100644 --- a/Source/Visitable/VisitableView.swift +++ b/Source/Visitable/VisitableView.swift @@ -45,6 +45,7 @@ open class VisitableView: UIView { open lazy var refreshControl: UIRefreshControl = { let refreshControl = UIRefreshControl() + refreshControl.translatesAutoresizingMaskIntoConstraints = false refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged) return refreshControl }() @@ -67,13 +68,21 @@ open class VisitableView: UIView { guard let scrollView = webView?.scrollView, allowsPullToRefresh else { return } #if !targetEnvironment(macCatalyst) - scrollView.refreshControl = refreshControl + scrollView.addSubview(refreshControl) + + let height = refreshControl.frame.height > 0 ? refreshControl.frame.height : 60 + + NSLayoutConstraint.activate([ + refreshControl.centerXAnchor.constraint(equalTo: centerXAnchor), + refreshControl.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor), + refreshControl.heightAnchor.constraint(equalToConstant: height) + ]) #endif } private func removeRefreshControl() { refreshControl.endRefreshing() - webView?.scrollView.refreshControl = nil + refreshControl.removeFromSuperview() } @objc func refresh(_ sender: AnyObject) { From 264ba08541d5d9d0f2259b60b8425067c87a75a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20=C5=A0vara?= Date: Fri, 19 May 2023 16:38:38 +0200 Subject: [PATCH 3/3] Document refresh control height. --- Source/Visitable/VisitableView.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/Visitable/VisitableView.swift b/Source/Visitable/VisitableView.swift index 49ca84a..12452b5 100644 --- a/Source/Visitable/VisitableView.swift +++ b/Source/Visitable/VisitableView.swift @@ -70,12 +70,14 @@ open class VisitableView: UIView { #if !targetEnvironment(macCatalyst) scrollView.addSubview(refreshControl) - let height = refreshControl.frame.height > 0 ? refreshControl.frame.height : 60 + /// Infer refresh control's default height from its frame, if given. + /// Otherwise fallback to 60 (the default height). + let refreshControlHeight = refreshControl.frame.height > 0 ? refreshControl.frame.height : 60 NSLayoutConstraint.activate([ refreshControl.centerXAnchor.constraint(equalTo: centerXAnchor), refreshControl.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor), - refreshControl.heightAnchor.constraint(equalToConstant: height) + refreshControl.heightAnchor.constraint(equalToConstant: refreshControlHeight) ]) #endif }