Material "pull to refresh" 在 Swift 中?
Material "pull to refresh" in Swift?
我正在尝试像这样 Material pull to refresh GIF 在 WKWebView 中实现拉动刷新。因为我们想要包含已经有 html 导航栏的网站,所以我们需要在向下拖动时保持网页视图固定。我发现下拉刷新 (UIRefreshControl) 到 table 视图和 Web 视图,但视图会随着用户向下拖动而下降。
我将委托设置为 web 视图的 scrollView 属性 并接收通知。当我拖动到顶部并到达 0(垂直滚动视图偏移)时,我可以禁用滚动视图,启用平移手势。但要真正移动自定义微调器视图,我需要第二次触摸。
方法 func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?)
不起作用,因为我有一个滚动视图。
private func gestures() {
self.panGesture = UIPanGestureRecognizer(
target: self,
action: "panGestureCaptured:"
)
self.panGesture!.enabled = false
self.webView.addGestureRecognizer(self.panGesture!)
}
func scrollViewDidScroll(scrollView: UIScrollView) {
if scrollView.contentOffset.y <= 0 {
self.view.layoutIfNeeded()
self.spinnerTopLayoutConstraint?.constant = -scrollView.contentOffset.y
}
}
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if scrollView.panGestureRecognizer.translationInView(scrollView.superview).y > 0 { // dragging down
if scrollView.contentOffset.y == 0 {
self.webView!.scrollView.scrollEnabled = false
// self.webView!.scrollView.canCancelContentTouches = true
self.panGesture!.enabled = true
// self.refreshWebView()
}
self.showNavigationItems()
} else { // dragging up
self.hideNavigationItems()
}
}
感谢@Darko:我的想法是使用滚动视图的 panGesture 属性(还有 Web 视图的 属性)。
private func gestures() {
self.webView.scrollView.panGestureRecognizer.addTarget(
self,
action: "panGestureCaptured:"
)
}
func panGestureCaptured(gesture: UIGestureRecognizer) {
let touchPoint = gesture.locationInView(self.webView)
print("touchPoint: \(touchPoint)")
print("panGestureCaptured scrollView offset \(self.webView!.scrollView.contentOffset.y)")
if self.webView!.scrollView.contentOffset.y == 0 {
if self.webView!.scrollView.panGestureRecognizer.state == UIGestureRecognizerState.Changed {
if touchPoint.y < self.webView!.frame.height * 0.3 {
self.spinnerTopLayoutConstraint?.constant = touchPoint.y
} else {
self.spinnerTopLayoutConstraint?.constant = self.webView!.frame.height * 0.3
}
} else if self.webView!.scrollView.panGestureRecognizer.state == UIGestureRecognizerState.Ended {
self.spinnerTopLayoutConstraint?.constant = UIApplication.sharedApplication().statusBarFrame.height + 20
}
}
}
WebView 的滚动视图已经有一个平移识别器 (webView.scrollView.panGestureRecognizer),因此您可以收听这个(使用 addTarget)并禁用滚动视图上的弹跳。这样你就不需要 disable/enable pan 识别器了。
我正在尝试像这样 Material pull to refresh GIF 在 WKWebView 中实现拉动刷新。因为我们想要包含已经有 html 导航栏的网站,所以我们需要在向下拖动时保持网页视图固定。我发现下拉刷新 (UIRefreshControl) 到 table 视图和 Web 视图,但视图会随着用户向下拖动而下降。
我将委托设置为 web 视图的 scrollView 属性 并接收通知。当我拖动到顶部并到达 0(垂直滚动视图偏移)时,我可以禁用滚动视图,启用平移手势。但要真正移动自定义微调器视图,我需要第二次触摸。
方法 func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?)
不起作用,因为我有一个滚动视图。
private func gestures() {
self.panGesture = UIPanGestureRecognizer(
target: self,
action: "panGestureCaptured:"
)
self.panGesture!.enabled = false
self.webView.addGestureRecognizer(self.panGesture!)
}
func scrollViewDidScroll(scrollView: UIScrollView) {
if scrollView.contentOffset.y <= 0 {
self.view.layoutIfNeeded()
self.spinnerTopLayoutConstraint?.constant = -scrollView.contentOffset.y
}
}
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if scrollView.panGestureRecognizer.translationInView(scrollView.superview).y > 0 { // dragging down
if scrollView.contentOffset.y == 0 {
self.webView!.scrollView.scrollEnabled = false
// self.webView!.scrollView.canCancelContentTouches = true
self.panGesture!.enabled = true
// self.refreshWebView()
}
self.showNavigationItems()
} else { // dragging up
self.hideNavigationItems()
}
}
感谢@Darko:我的想法是使用滚动视图的 panGesture 属性(还有 Web 视图的 属性)。
private func gestures() {
self.webView.scrollView.panGestureRecognizer.addTarget(
self,
action: "panGestureCaptured:"
)
}
func panGestureCaptured(gesture: UIGestureRecognizer) {
let touchPoint = gesture.locationInView(self.webView)
print("touchPoint: \(touchPoint)")
print("panGestureCaptured scrollView offset \(self.webView!.scrollView.contentOffset.y)")
if self.webView!.scrollView.contentOffset.y == 0 {
if self.webView!.scrollView.panGestureRecognizer.state == UIGestureRecognizerState.Changed {
if touchPoint.y < self.webView!.frame.height * 0.3 {
self.spinnerTopLayoutConstraint?.constant = touchPoint.y
} else {
self.spinnerTopLayoutConstraint?.constant = self.webView!.frame.height * 0.3
}
} else if self.webView!.scrollView.panGestureRecognizer.state == UIGestureRecognizerState.Ended {
self.spinnerTopLayoutConstraint?.constant = UIApplication.sharedApplication().statusBarFrame.height + 20
}
}
}
WebView 的滚动视图已经有一个平移识别器 (webView.scrollView.panGestureRecognizer),因此您可以收听这个(使用 addTarget)并禁用滚动视图上的弹跳。这样你就不需要 disable/enable pan 识别器了。