国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

IOS中Swift仿QQ最新版抽屜側滑和彈框視圖

2019-10-21 18:47:48
字體:
來源:轉載
供稿:網友

導讀

簡單用Swift寫了一個抽屜效果,可以直接使用并且簡單;

很多軟件都運了抽屜效果,比如qq的左抽屜,英雄聯盟,滴滴打車,和uber等等都運用了抽屜;

效果

ios,抽屜式側滑,抽屜側滑菜單,swift,側滑菜單

iOS抽屜式結構實現分析

主要是在控制器的View上添加了兩個View,一個左側leftView和一個mainView。這里我們自定義一個DrawerViewController,init(mainVC: UIViewController, leftMenuVC: UIViewController, leftWidth: CGFloat)設置,一個mainVC,一個leftMenuVC,和一個寬度,將mainVC和leftMenuVC的view添加到controller的view上(menuVC的view在下面)。

   view.addSubview(leftMenuVC.view)   view.addSubview(mainVC.view)   addChildViewController(leftMenuVC)   addChildViewController(mainVC)

然后首先實現點擊方法openLeftMenu和closeLeftMenu(這兩個方法主要是計算mainVC的view的位置)方便以后調用。

//MARK: - 打開左側菜單  func openLeftMenu() {    UIView.animate(withDuration: 0.25, delay: 0, options: UIViewAnimationOptions.curveLinear, animations: {      self.leftVC?.view.transform = CGAffineTransform.identity      self.mainVC?.view.transform = CGAffineTransform(translationX: self.maxWidth, y: 0)    }, completion: {      (finish: Bool) -> () in      self.mainVC?.view.addSubview(self.coverBtn)    })  }  //MARK: - 關閉左側菜單  func closeLeftMenu() {    UIView.animate(withDuration: 0.25, delay: 0, options: UIViewAnimationOptions.curveLinear, animations: {      self.leftVC?.view.transform = CGAffineTransform(translationX: -self.maxWidth, y: 0)      self.mainVC?.view.transform = CGAffineTransform.identity    }, completion: {      (finish: Bool) -> () in      self.coverBtn.removeFromSuperview()    })  }

最后給mainVC的view添加屏幕邊緣手勢,實現mainVC的view跟隨手指移動。循環遍歷view給每一個一級視圖添加手勢

for childViewController in (mainVC?.childViewControllers)! {     addScreenEdgePanGestureRecognizerToView(view: childViewController.view)   }
//MARK: - 添加屏幕邊緣手勢  private func addScreenEdgePanGestureRecognizerToView(view: UIView) {    let pan = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(edgPanGesture(_:)))    pan.edges = UIRectEdge.left    view.addGestureRecognizer(pan)  }

在平移手勢調用的方法中,通過偏移量來確定mainView的frame,實現動畫效果

  1. 首先通過pan.translation(in: pan.view).x方法獲取偏移量,通過偏移量的正負確定拖動的方向
  2. 當手指松開后需要根據mainView的x值確定其視圖是定位到原始位置還是其縮放的位置

打開手勢

//MARK: - 屏幕左邊緣手勢  func edgPanGesture(_ pan: UIScreenEdgePanGestureRecognizer) {    let offsetX = pan.translation(in: pan.view).x    if pan.state == UIGestureRecognizerState.changed && offsetX <= maxWidth {      mainVC?.view.transform = CGAffineTransform(translationX: max(offsetX, 0), y: 0)      leftVC?.view.transform = CGAffineTransform(translationX: -maxWidth + offsetX, y: 0)    } else if pan.state == UIGestureRecognizerState.ended || pan.state == UIGestureRecognizerState.cancelled || pan.state == UIGestureRecognizerState.failed {      if offsetX > screenW * 0.5 {        openLeftMenu()      } else {        closeLeftMenu()      }    }  }

關閉遮蓋手勢

//MARK: - 遮蓋按鈕手勢  func panCloseLeftMenu(_ pan: UIPanGestureRecognizer) {    let offsetX = pan.translation(in: pan.view).x    if offsetX > 0 {return}    if pan.state == UIGestureRecognizerState.changed && offsetX >= -maxWidth {      let distace = maxWidth + offsetX      mainVC?.view.transform = CGAffineTransform(translationX: distace, y: 0)      leftVC?.view.transform = CGAffineTransform(translationX: offsetX, y: 0)    } else if pan.state == UIGestureRecognizerState.ended || pan.state == UIGestureRecognizerState.cancelled || pan.state == UIGestureRecognizerState.failed {      if offsetX > screenW * 0.5 {        openLeftMenu()      } else {        closeLeftMenu()      }    }  }

UIPresentationController簡介

  1. UIPresentationController是 iOS8 新增的一個API,蘋果的官方定義是:對象為所呈現的視圖控制器提供高級視圖的轉換管理(從呈現視圖控制器的時間直到它被消除期間);
  2. iOS 8以前就是自定義view,去畫一個三角和長方形;
  3. 簡單直接的方法用圖片

直接貼代碼不講廢話

@IBAction func showAlert(_ sender: UIBarButtonItem) {    let popVC = PopViewController()    popVC.modalPresentationStyle = UIModalPresentationStyle.popover    popVC.popoverPresentationController?.barButtonItem = sender    popVC.popoverPresentationController?.delegate = self    //可控制三角顏色    popVC.popoverPresentationController?.backgroundColor = UIColor.white    present(popVC, animated: true, completion: nil)  }  func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {    return UIModalPresentationStyle.none  }  func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool {    return true  }

具體代碼可以從這里下載:WLDrawerView.rar

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德化县| 来宾市| 隆德县| 二手房| 岗巴县| 湘潭县| 虞城县| 休宁县| 雷州市| 木里| 湖北省| 宁津县| 无为县| 绩溪县| 措美县| 都安| 宣武区| 美姑县| 攀枝花市| 贵州省| 汶川县| 抚松县| 古交市| 道孚县| 景东| 宝山区| 十堰市| 恩平市| 个旧市| 富源县| 房产| 鞍山市| 虞城县| 大庆市| 长春市| 阜康市| 南京市| 灵川县| 赤城县| 张家界市| 石景山区|