2016-03-02 2 views
3

Я пытаюсь добиться увеличения, чтобы обновить WKWebView, как в этом Material pull to refresh GIF. Поскольку мы хотим включить веб-сайты, на которых уже есть панель навигации html, нам нужно сохранить исправление веб-страницы при перетаскивании вниз. Я нашел pull to refresh (UIRefreshControl) для просмотра таблиц и веб-представлений, но представления уменьшаются по мере того, как пользователь тащит вниз.Материал «тянуть, чтобы освежить» в Свифт?

Я установил делегат для прокрутки свойства просмотра веб-представления и получения уведомлений. Когда я перетаскиваю вверху и добираюсь до 0 (смещение в вертикальном прокрутке), я могу отключить просмотр прокрутки, включить жест панорамы. Но для того, чтобы на самом деле переместить пользовательский вид Spinner, мне нужно второе прикосновение.

Метод 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() 
    } 
} 
+0

Просто идея: в прокрутке просмотра WebView уже есть распознаватель панорамирования (webView.scrollView.panGestureRecognizer), чтобы вы могли прослушать этот (с помощью addTarget) и отключить подпрыгивание в режиме прокрутки. Таким образом вам не нужно отключать/активировать распознаватель панорамирования. – Darko

+0

Это сработало! Большое вам спасибо @Darko –

+0

Добро пожаловать. Я добавил комментарий в качестве ответа, пожалуйста, отметьте свой вопрос как ответ. – Darko

ответ

1

Благодаря @Darko: идея состояла в том, чтобы использовать panGesture свойство зрения прокрутки (также свойство веб-просмотра). вид прокрутки

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 
     } 
    } 
} 
1

Webview уже имеет пан распознаватель (webView.scrollView.panGestureRecognizer), чтобы вы могли слушать этот (с addTarget) и отключить подпрыгивая на представлении прокрутки. Таким образом вам не нужно отключать/активировать распознаватель панорамирования.