IOS中迅速仿QQ最新版抽屉侧滑和弹框视图

  

<>强导读

  

简单用迅速写了一个抽屉效果,可以直接使用并且简单,
  

  

很多软件都运了抽屉效果,比如qq的左抽屉,英雄联盟,滴滴打车,和乳房等等都运用了抽屉;

  

<>强效果

  

 IOS中迅速仿QQ最新版抽屉侧滑和弹框视图”> <br/>
  </p>
  <p> <强> iOS抽屉式结构实现分析</强> </p>
  <p>主要是在控制器的视图上添加了两个观点,一个左侧leftView和一个mainView。这里我们自定义一个DrawerViewController, init (mainVC: ui, leftMenuVC: ui, leftWidth: CGFloat)设置,一个mainVC,一个leftMenuVC,和一个宽度,将mainVC和leftMenuVC的视图中添加到控制器的视图上(menuVC的视图在下面)。</p>
  
  <pre类=   view.addSubview (leftMenuVC.view)   view.addSubview (mainVC.view)      addChildViewController (leftMenuVC)   addChildViewController (mainVC)   之前      

然后首先实现点击方法openLeftMenu和closeLeftMenu(这两个方法主要是计算mainVC的视图的位置)方便以后调用。
  

     //马克:- - - - - -打开左侧菜单   func openLeftMenu () {      UIView。动画(withDuration: 0.25,延迟:0,选项:UIViewAnimationOptions。curveLinear动画:{      self.leftVC& # 63; .view。变换=CGAffineTransform.identity   self.mainVC& # 63; .view。变换=CGAffineTransform (translationX:自我。maxWidth y: 0)         完成}:{      (完成:Bool)→()      self.mainVC& # 63; .view.addSubview (self.coverBtn)      })      }//标记:关闭左侧菜单   func closeLeftMenu () {      UIView。动画(withDuration: 0.25,延迟:0,选项:UIViewAnimationOptions。curveLinear动画:{      self.leftVC& # 63; .view。变换=CGAffineTransform (translationX:自我。maxWidth y: 0)   self.mainVC& # 63; .view。变换=CGAffineTransform.identity         完成}:{      (完成:Bool)→()      self.coverBtn.removeFromSuperview ()      })         }      之前      

最后给mainVC的视图中添加屏幕边缘手势,实现mainVC的观点跟随手指移动。循环遍历视图给每一个一级视图添加手势

        在(childViewController mainVC& # 63; .childViewControllers) !{      addScreenEdgePanGestureRecognizerToView(视图:childViewController.view)      }   之前         //标记:添加屏幕边缘手势   私人func addScreenEdgePanGestureRecognizerToView(视图:UIView) {      让潘=UIScreenEdgePanGestureRecognizer(目标:自我,行动:#选择器(edgPanGesture (_:)))   平底锅。边缘=UIRectEdge.left   view.addGestureRecognizer (pan)      }   之前      

在平移手势调用的方法中,通过偏移量来确定mainView的框架,实现动画效果

  
      <李>首先通过锅。翻译(:pan.view)。x方法获取偏移量,通过偏移量的正负确定拖动的方向李   <李>当手指松开后需要根据mainView的x值确定其视图是定位到原始位置还是其缩放的位置李   
  

打开手势

     //标记:屏幕左边缘手势   func edgPanGesture(_潘:UIScreenEdgePanGestureRecognizer) {      让offsetX=锅。翻译:pan.view方式      如果锅。==UIGestureRecognizerState状态。改变,,offsetX & lt;=maxWidth {      mainVC& # 63; .view。变换=CGAffineTransform (translationX:马克斯(offsetX, 0), y: 0)   leftVC& # 63; .view。变换=CGAffineTransform (translationX: maxwidth + offsetX y: 0)      }如果锅。==UIGestureRecognizerState状态。结束了| |平底锅。==UIGestureRecognizerState状态。取消了| |平底锅。==UIGestureRecognizerState状态。{失败      如果offsetX比;screenW * 0.5 {      openLeftMenu ()      其他}{      closeLeftMenu ()   }      }      }      之前      

关闭遮盖手势
  

     //马克:——遮盖按钮手势   func panCloseLeftMenu(_潘:UIPanGestureRecognizer) {      让offsetX=锅。翻译:pan.view方式   如果offsetX比;0{返回}      如果锅。==UIGestureRecognizerState状态。改变,,offsetX祝辞=maxwidth {      让distace=maxWidth + offsetX      mainVC& # 63; .view。变换=CGAffineTransform (translationX: distace y: 0)   leftVC& # 63; .view。变换=CGAffineTransform (translationX: offsetX y: 0)      }如果锅。==UIGestureRecognizerState状态。结束了| |平底锅。==UIGestureRecognizerState状态。取消了| |平底锅。==UIGestureRecognizerState状态。{失败      如果offsetX比;screenW * 0.5 {      openLeftMenu ()      其他}{      closeLeftMenu ()   }      }      }      

IOS中迅速仿QQ最新版抽屉侧滑和弹框视图