swift實(shí)現(xiàn)抽屜效果

預(yù)覽圖如下:


image.gif

GitHub 地址:https://github.com/zhangml0522/swiftDrawer

文件一覽

文件一覽

1.ViewController:?jiǎn)?dòng)頁,包含了LeftViewController和MainViewController:UITabBarController
2.LeftViewController:抽屜的view
3.MainViewController:UITabBarController
4.ClickViewController:UITabBarController的子view

AppDelegate設(shè)置啟動(dòng)頁

//啟動(dòng)頁設(shè)置為ViewController
let leftVC = LeftViewController()
        let mainVC = MainViewController()
        let vc = ViewController(leftController: leftVC, mainController: mainVC)
        window?.rootViewController = UINavigationController(rootViewController: vc)
        window?.makeKeyAndVisible()

LeftViewController創(chuàng)建抽屜的view

override func viewDidLoad() {
        super.viewDidLoad()
        //寬度設(shè)置為275
        self.view.frame = CGRect(x: 0, y: 0, width: 275, height: UIScreen.main.bounds.size.height)
        self.view.backgroundColor = UIColor.lightGray
        
        let btn = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
        btn.center = self.view.center
        btn.setTitle("click", for: .normal)
        self.view .addSubview(btn)
        btn.addTarget(self, action: #selector(click), for: .touchUpInside)
    }

ViewController

//用枚舉來記錄抽屜的開關(guān)狀態(tài)
enum NowState {
    case open
    case close
}
//默認(rèn)為close
var state = NowState.close
//重寫init方法,把LeftViewController和MainViewController加進(jìn)來
init(leftController : LeftViewController , mainController : MainViewController){
        super.init(nibName: nil, bundle: nil)
        self.leftViewController = leftController
        self.mainViewController = mainController
        
        view.addSubview(mainController.view)
        view.addSubview(leftController.view)
        
        addChildViewController(mainController)
        addChildViewController(leftController)
    }
//viewWillAppear里先把leftViewController移動(dòng)到屏幕外
override func viewWillAppear(_ animated: Bool) {
        leftViewController?.view.transform = CGAffineTransform(translationX: -275, y: 0)
    }

"抽屜"按鈕的單擊響應(yīng)方法

@objc func openLeftView(){
        UIView.animate(withDuration: 0.7) {
            if(self.state == NowState.close){
                self.mainViewController?.view.transform = CGAffineTransform(translationX: 275, y: 0)
                self.leftViewController?.view.transform = CGAffineTransform(translationX: 0, y: 0)
                self.state = NowState.open
            }else{
                self.mainViewController?.view.transform = CGAffineTransform(translationX: 0, y: 0)
                self.leftViewController?.view.transform = CGAffineTransform(translationX: -275, y: 0)
                self.state = NowState.close
            }
        }
    }

單擊按鈕后若為close狀態(tài)則leftView和mainView都向右平移275并將狀態(tài)改為open
單擊按鈕后若為open狀態(tài)則leftView和mainView都向左平移275并將狀態(tài)改為close
目前為止完成單擊按鈕彈出和恢復(fù)抽屜的功能


image.gif

添加手勢(shì)

override func viewDidLoad() {
        super.viewDidLoad()
        let gesture = UIPanGestureRecognizer(target: self, action: #selector(viewPan(sender:)))
        self.mainViewController?.view.addGestureRecognizer(gesture)
    }
 @objc func viewPan(sender: UIPanGestureRecognizer) {
        
        let x = sender.translation(in: self.mainViewController?.view).x
        
        guard let frame = self.leftViewController?.view.frame,
            let frame2 = self.mainViewController?.view.frame else{
                return;
        }
        
        if(sender.state == UIGestureRecognizerState.changed){
            //當(dāng)為close狀態(tài)時(shí),不能向左滑動(dòng)
            if(self.state == NowState.close && x-275 >= -275){
                mainViewController?.view.transform = CGAffineTransform(translationX: x, y: 0)
                leftViewController?.view.transform = CGAffineTransform(translationX: x-275, y: 0)
                print("x:\(x)--main:\(frame2.origin.x)--left:\(frame.origin.x)")
            //當(dāng)為open狀態(tài)時(shí),不能向右滑動(dòng)
            }else if(self.state == NowState.open && x+275 <= 275){
                mainViewController?.view.transform = CGAffineTransform(translationX: x+275, y: 0)
                leftViewController?.view.transform = CGAffineTransform(translationX: x, y: 0)
                print("x:\(x)--main:\(frame2.origin.x)--left:\(frame.origin.x)")
            }
            
        }else if(sender.state == UIGestureRecognizerState.ended || sender.state == UIGestureRecognizerState.cancelled || sender.state == UIGestureRecognizerState.failed){
            UIView.animate(withDuration: 0.7) {
                //結(jié)束滑動(dòng)的時(shí)候,根據(jù)結(jié)束時(shí)的位置來判斷剩下的動(dòng)畫是打開還是關(guān)閉
                if(frame2.origin.x >= 133)){
                    self.state = NowState.open
                    self.mainViewController?.view.transform = CGAffineTransform(translationX: 275, y: 0)
                    self.leftViewController?.view.transform = CGAffineTransform(translationX: 0, y: 0)
                }else{
                    self.state = NowState.close
                    self.mainViewController?.view.transform = CGAffineTransform(translationX: 0, y: 0)
                    self.leftViewController?.view.transform = CGAffineTransform(translationX: -275, y: 0)
                }
            }
            print("x:\(x)--main:\(frame2.origin.x)--left:\(frame.origin.x)")
        }
        
    }

以上就是滑動(dòng)手勢(shì)的代碼


image.gif

頁面跳轉(zhuǎn)

     //如果時(shí)打開狀態(tài),先關(guān)閉然后跳轉(zhuǎn)
    @objc func clickPush(){
        if(state == NowState.open){
            UIView.animate(withDuration: 0.7, animations: {
                if(self.state == NowState.close){
                    self.mainViewController?.view.transform = CGAffineTransform(translationX: 275, y: 0)
                    self.leftViewController?.view.transform = CGAffineTransform(translationX: 0, y: 0)
                    self.state = NowState.open
                }else{
                    self.mainViewController?.view.transform = CGAffineTransform(translationX: 0, y: 0)
                    self.leftViewController?.view.transform = CGAffineTransform(translationX: -275, y: 0)
                    self.state = NowState.close
                }
            }, completion: { (stats) in
                let vc = ClickViewController()
                self.navigationController?.pushViewController(vc, animated: true)
            })
        }
    }
image.gif

以上就是主要代碼的說明,詳細(xì)代碼可以看GitHub上的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容