2017-11-30 14 views
-1

UIView 끌기에 대한 도움이 필요하면 기본보기 아래의 메뉴보기를 표시하십시오.UIView 끌기

나는 두 개의 UIView을 가지고 있습니다. menuView - 메뉴 버튼과 레이블 및 mainView - menuView 위에 있습니다.

메뉴 항목을 표시하고 기본보기를 특정 위치로 스냅하기 위해 왼쪽 가장자리에서 기본보기를 끌고 싶습니다. 나는 오른쪽으로 끌기를 얻을 수 있지만 왼쪽으로 끌 때 원래 위치로 되돌릴 수는 없습니다.

여기 내 코드는 나와 함께 놀았지만 성공하지 못했습니다. 오른쪽으로 드래그하면 mainView을 작게 만들려고합니다. 도움을 주시면 대단히 감사하겠습니다.

참고 : PanGesture는 mainView에 연결됩니다.

@IBAction func dragMenu(_ sender: UIPanGestureRecognizer) { 
    let mview = sender.view! 
    let originalCenter = CGPoint(x: self.mainView.bounds.width/2, y: self.mainView.bounds.height/2) 
    switch sender.state { 

    case .changed: 
     if let mview = sender.view { 
      mview.center.x = mview.center.x + sender.translation(in: view).x 
      sender.setTranslation(CGPoint.zero, in: view) 
     } 

    case .ended: 


      let DraggedHalfWayRight = mview.center.x > view.center.x 
      if DraggedHalfWayRight { 
       //dragginToRight 

       showMenu = !showMenu 
       self.mainViewRight.constant = 200 
            self.mainTop.constant = 50 
            self.mainBottom.constant = 50 
            self.mainLeft.constant = 200 

      } else //dragging left and set it back to original position. 
      { 
       mview.center = originalCenter 
       showMenu = !showMenu 
     } 



    default: 
     break 
    } 
} 

답변

0

나는 몇 가지 제안하십시오 :

  1. 가 오프 메뉴를 드래그 완료, 당신이 세로 인 경우에, 그것의 alpha 제로 (수 있도록 설정해야합니다 및 조경에 간다면, 갑자기 거기에 앉아있는 메뉴를 보지 않아도됩니다.)

  2. 개인적으로 드래그 한보기의 transform을 조정하고 제스처의 번역을 항상 0으로 재설정하지 마십시오. 그것은 개인적인 취향의 문제입니다.

  3. 제스처에 대한 위임자를 위임자로 지정하고 gestureRecognizerShouldBegin을 구현하면 (메뉴가 숨겨져 있으면 다시 숨기려고하지 않기 때문에 스 와이프를 숨기지 않으므로 숨기지 않으면 그것을 보여주기 위해 스 와이프를 인식하고 싶지는 않음).

  4. 제스처를 완료할지 여부를 결정할 때 제스처의 속도도 고려합니다 (예 : 약간의 영화는 애니메이션보기를 닫고 표시합니다). 따라서

:

class ViewController: UIViewController { 

    @IBOutlet weak var menuView: UIView! 

    var isMenuVisible = true 

    @IBAction func dragMenu(_ gesture: UIPanGestureRecognizer) { 
     let translationX = gesture.translation(in: gesture.view!).x 

     switch gesture.state { 
     case .began: 
      // if the menu is not visible, make sure it's off screen and then make it visible 

      if !isMenuVisible { 
       menuView.transform = CGAffineTransform(translationX: gesture.view!.bounds.width, y: 0) 
       menuView.alpha = 1 
      } 
      fallthrough 

     case .changed: 
      if isMenuVisible { 
       menuView.transform = CGAffineTransform(translationX: translationX, y: 0) 
      } else { 
       menuView.transform = CGAffineTransform(translationX: gesture.view!.bounds.width + translationX, y: 0) 
      } 

     case .ended: 
      let shouldComplete: Bool 
      if isMenuVisible { 
       shouldComplete = translationX > gesture.view!.bounds.width/2 || gesture.velocity(in: gesture.view!).x > 0 
      } else { 
       shouldComplete = -translationX > gesture.view!.bounds.width/2 || gesture.velocity(in: gesture.view!).x < 0 
      } 

      UIView.animate(withDuration: 0.25, animations: { 
       if self.isMenuVisible && shouldComplete || !self.isMenuVisible && !shouldComplete { 
        self.menuView.transform = CGAffineTransform(translationX: gesture.view!.bounds.width, y: 0) 
       } else { 
        self.menuView.transform = .identity 
       } 

       if shouldComplete{ 
        self.isMenuVisible = !self.isMenuVisible 
       } 
      }, completion: { _ in 
       self.menuView.alpha = self.isMenuVisible ? 1 : 0 
      }) 

     default: 
      break 
     } 
    } 

} 

extension ViewController: UIGestureRecognizerDelegate { 

    func gestureRecognizerShouldBegin(_ gesture: UIGestureRecognizer) -> Bool { 
     guard let gesture = gesture as? UIPanGestureRecognizer else { return true } 

     let translationX = gesture.translation(in: gesture.view!).x 

     return isMenuVisible && translationX > 0 || !isMenuVisible && translationX < 0 
    } 

} 

는 개인적으로, 나는 당신이 정말로 그것을 어디 제스처를 인식하지 않으려는 (다시 화면에 메뉴를 끌어 별도의 화면 가장자리 제스처 인식기를 사용하는 것을 선호 , 다만 그 오른쪽 가장자리에).

class ViewController: UIViewController { 

    @IBOutlet weak var menuView: UIView! 

    var isMenuVisible = true 

    @IBAction func handleScreenEdgeGesture(_ gesture: UIScreenEdgePanGestureRecognizer) { 
     let translationX = gesture.translation(in: gesture.view!).x 

     switch gesture.state { 
     case .began: 
      menuView.transform = CGAffineTransform(translationX: gesture.view!.bounds.width, y: 0) 
      menuView.alpha = 1 
      fallthrough 

     case .changed: 
      menuView.transform = CGAffineTransform(translationX: gesture.view!.bounds.width + translationX, y: 0) 

     case .ended: 
      let shouldComplete = -translationX > gesture.view!.bounds.width/2 || gesture.velocity(in: gesture.view!).x < 0 

      UIView.animate(withDuration: 0.25, delay:0, options: .curveEaseOut, animations: { 
       if shouldComplete { 
        self.menuView.transform = .identity 
        self.isMenuVisible = !self.isMenuVisible 
       } else { 
        self.menuView.transform = CGAffineTransform(translationX: gesture.view!.bounds.width, y: 0) 
       } 
      }, completion: { _ in 
       self.menuView.alpha = self.isMenuVisible ? 1 : 0 
      }) 

     default: 
      break 
     } 
    } 

    @IBAction func dragMenu(_ gesture: UIPanGestureRecognizer) { 
     let translationX = gesture.translation(in: gesture.view!).x 

     switch gesture.state { 
     case .began, .changed: 
      menuView.transform = CGAffineTransform(translationX: translationX, y: 0) 

     case .ended: 
      let shouldComplete = translationX > gesture.view!.bounds.width/2 || gesture.velocity(in: gesture.view!).x > 0 

      UIView.animate(withDuration: 0.25, delay:0, options: .curveEaseOut, animations: { 
       if shouldComplete { 
        self.menuView.transform = CGAffineTransform(translationX: gesture.view!.bounds.width, y: 0) 
        self.isMenuVisible = !self.isMenuVisible 
       } else { 
        self.menuView.transform = .identity 
       } 
      }, completion: { _ in 
       self.menuView.alpha = self.isMenuVisible ? 1 : 0 
      }) 

     default: 
      break 
     } 
    } 

} 

extension ViewController: UIGestureRecognizerDelegate { 

    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 
     if gestureRecognizer is UIScreenEdgePanGestureRecognizer { 
      return !isMenuVisible 
     } else if let gesture = gestureRecognizer as? UIPanGestureRecognizer { 
      let translationX = gesture.translation(in: gesture.view!).x 
      return isMenuVisible && translationX > 0 
     } 

     return true 
    } 

} 
+0

안녕 롭, 빠른 회신 감사 :이 방법의 또 다른 미덕은 "쇼"와 다른 기능에서 "숨기기"를 유지하여, 코드가 훨씬 더 읽기 (IMHO)는 것입니다. 이렇게하면 메인 뷰가 화면 밖으로 밀려납니다 ... 메뉴가 열릴 때 메인 뷰가 오른쪽에, 메뉴가 왼쪽에있게하고 싶었습니다. 메인 뷰를 다시 드래그하여 메뉴 뷰를 닫으십시오. 다시 도움을 청합니다. –

+0

나는 알아 냈다. Nvm. 감사 –