2015-09-09 58 views
1

我执行导航而不Raywenderlich教程库:左侧导航斯威夫特与UIPanGestureRecognizer

http://www.raywenderlich.com/78568/create-slide-out-navigation-panel-swift

我试图做的代码一些修改不具有右侧导航,但是当我滑动时,我会得到一个黑色的背景,正在打开。

所以我认为,该问题可能是由正在添加UIPanGestureRecognizer并试图用UISwipeGestureRecognizer,但我不知道该怎么做,或者如果它的好办法:

enum SlideOutState{ 
    case BothCollapsed 
    case LeftPanelExpanded 
} 

class ContainerViewController: UIViewController { 

    var centerNavigationController: UINavigationController! 
    var centerViewController: CenterViewController! 
    var currentState: SlideOutState = .BothCollapsed 
    var leftViewController: SidePanelViewController? 
    let centerPanelExpandedOffset: CGFloat = 60 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     centerViewController = UIStoryboard.centerViewController() 
     centerViewController.delegate = self 

     centerNavigationController = UINavigationController(rootViewController: centerViewController) 
     view.addSubview(centerNavigationController.view) 
     addChildViewController(centerNavigationController) 

     centerNavigationController.didMoveToParentViewController(self) 

     /* 
     let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: "handlePanGesture:") 
     centerNavigationController.view.addGestureRecognizer(panGestureRecognizer) 
     */ 

     var swipeRight = UISwipeGestureRecognizer(target: self, action: "handleSwipeGesture:") 
     swipeRight.direction = UISwipeGestureRecognizerDirection.Right 
     self.view.addGestureRecognizer(swipeRight) 
    } 
} 

// MARK: CenterViewController delegate 


extension ContainerViewController : CenterViewControllerDelegate{ 

    func toggleLeftPanel() { 
     let notAlreadyExpanded = (currentState != .LeftPanelExpanded) 

     if notAlreadyExpanded { 
      addLeftPanelViewController() 
     } 

     animateLeftPanel(shouldExpand: notAlreadyExpanded) 
    } 

    func collapseSidePannels() { 
     switch (currentState) { 
     case .LeftPanelExpanded: 
      toggleLeftPanel() 
     default: 
      break 
     } 
    } 

    func addLeftPanelViewController() { 
     if (leftViewController == nil) { 
      leftViewController = UIStoryboard.leftViewController() 
      leftViewController!.menus = Menu.allMenu() 

      addChildSidePanelController(leftViewController!) 
     } 
    } 

    func addChildSidePanelController(sidePanelController: SidePanelViewController) { 
     sidePanelController.delegate = centerViewController 
     view.insertSubview(sidePanelController.view, atIndex: 0) 

     addChildViewController(sidePanelController) 
     sidePanelController.didMoveToParentViewController(self) 
    } 


    func animateLeftPanel(#shouldExpand: Bool) { 
     if (shouldExpand) { 
      currentState = .LeftPanelExpanded 

      animateCenterPanelXPosition(targetPosition: CGRectGetWidth(centerNavigationController.view.frame) - centerPanelExpandedOffset) 
     } else { 
      animateCenterPanelXPosition(targetPosition: 0) { finished in 
       self.currentState = .BothCollapsed 

       self.leftViewController!.view.removeFromSuperview() 
       self.leftViewController = nil; 
      } 
     } 
    } 

    func animateCenterPanelXPosition(#targetPosition: CGFloat, completion: ((Bool) -> Void)! = nil) { 
     UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .CurveEaseInOut, animations: { 
      self.centerNavigationController.view.frame.origin.x = targetPosition 
      }, completion: completion) 
    } 

} 

/* 
extension ContainerViewController: UIGestureRecognizerDelegate { 
    // MARK: Gesture recognizer 

    func handlePanGesture(recognizer: UIPanGestureRecognizer) { 
     let gestureIsDraggingFromLeftToRight = (recognizer.velocityInView(view).x > 0) 

     switch(recognizer.state) { 
     case .Began: 
      if (currentState == .BothCollapsed) { 
       if (gestureIsDraggingFromLeftToRight) { 
        addLeftPanelViewController() 
       } 
      } 
     case .Changed: 
      recognizer.view!.center.x = recognizer.view!.center.x + recognizer.translationInView(view).x 
     case .Ended: 
      if (leftViewController != nil) { 
       // animate the side panel open or closed based on whether the view has moved more or less than halfway 
       let hasMovedGreaterThanHalfway = recognizer.view!.center.x > view.bounds.size.width 
       animateLeftPanel(shouldExpand: hasMovedGreaterThanHalfway) 
      } 
     default: 
      break 
     } 
    } 
} 
*/ 

extension ContainerViewController: UIGestureRecognizerDelegate { 
    func handleSwipeGesture(gesture: UIGestureRecognizer) { 
     if let swipeGesture = gesture as? UISwipeGestureRecognizer{ 
      switch (gesture.state){ 
      case UISwipeGestureRecognizerDirection.Right: 
       addLeftPanelViewController() 
      default: 
       break 
      } 
     } 
    } 
} 

private extension UIStoryboard { 
    class func mainStoryboard() -> UIStoryboard { return UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) } 

    class func leftViewController() -> SidePanelViewController? { 
     return mainStoryboard().instantiateViewControllerWithIdentifier("LeftViewController") as? SidePanelViewController 
    } 

    class func centerViewController() -> CenterViewController? { 
     return mainStoryboard().instantiateViewControllerWithIdentifier("CenterViewController") as? CenterViewController 
    } 

} 

回答

1

只要改变.Changed情况:

if (((recognizer.view!.center.x + recognizer.translationInView(view).x) > view.center.x || gestureIsDraggingFromLeftToRight) && (recognizer.view!.center.x >= view.center.x && recognizer.velocityInView(view).x > 0 || recognizer.view!.center.x > view.center.x && recognizer.velocityInView(view).x < 0) && recognizer.view!.center.x + recognizer.translationInView(view).x > view.center.x) { 
recognizer.view!.center.x = recognizer.view!.center.x + recognizer.translationInView(view).x 
       recognizer.setTranslation(CGPointZero, inView: view) 
}