简单实现界面的侧滑效果(Swift)仿QQ侧滑效果
2016-06-07 17:20
417 查看
废话不多说,看效果图
侧滑.gif
MGDetailViewController.Xib
MGMainTViewController.view
源码暂时没有放到网上,有需要再私信
文/Mg明明就是你(简书作者)
原文链接:http://www.jianshu.com/p/2acd50d8cc2c
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
侧滑.gif
viewController
// // ViewController.swift // MGSlideViewDemo // // Created by ming on 16/6/5. // Copyright © 2016年 ming. All rights reserved. // import UIKit // 定义几个常量,可以自己修改值 let MGScreenWidth = UIScreen.mainScreen().bounds.width let offsetDetailRight:CGFloat = 90 let offsetMainRight:CGFloat = 320 class ViewController: UIViewController,UIGestureRecognizerDelegate { var detailView: UIView? var coverView: UIView? var mainView: UIView? override func viewDidLoad() { super.viewDidLoad() setUpChildrenView() setupGestureRecognizer() } // 创建右边的控制器 func setUpChildrenView(){ let detailViewController = MGDetailViewController() self.addChildViewController(detailViewController) detailViewController.view.frame = CGRectMake(-offsetDetailRight,self.view.frame.origin.y, self.view.frame.width, self.view.frame.height) self.view.addSubview(detailViewController.view) self.detailView = detailViewController.view let mainViewController = MGMainTViewController() self.addChildViewController(mainViewController) mainViewController.view.frame = self.view.bounds self.view.addSubview(mainViewController.view) self.mainView = mainViewController.view; self.mainView!.backgroundColor = UIColor.greenColor() self.mainView!.addObserver(self, forKeyPath: "frame", options: NSKeyValueObservingOptions.Old, context: nil) // 添加coverView let coverView = UIView() coverView.frame = self.mainView!.frame coverView.hidden = true coverView.alpha = 0.9 self.mainView!.addSubview(coverView) self.coverView = coverView; let tap = UITapGestureRecognizer(target: self, action: Selector("tap")) self.coverView?.addGestureRecognizer(tap) } func tap(){ if self.mainView!.frame.origin.x != 0 { UIView.animateWithDuration(0.25, animations: { () -> Void in self.mainView!.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height); self.detailView!.frame = CGRectMake(-offsetDetailRight, self.view.frame.origin.y, self.view.frame.width, self.view.frame.height); }); } } // KVO 监听mainView的frame的变化 override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { if self.mainView!.frame.origin.x == offsetMainRight { self.coverView?.hidden = false; } else { self.coverView?.hidden = true; } } // 添加pan手势 func setupGestureRecognizer(){ let pan = UIPanGestureRecognizer(target: self, action: Selector("pan:")) // pan.delegate = self; self.mainView!.addGestureRecognizer(pan) } func pan(pan:UIPanGestureRecognizer){ let transP = pan.translationInView(self.view) self.mainView!.frame = mainFrameWithoffsetX(transP.x) pan.setTranslation(CGPointZero, inView: self.mainView!) self.detailView!.frame = detailFrameWithoffsetX(transP.x) pan.setTranslation(CGPointZero, inView: self.detailView!) if pan.state == UIGestureRecognizerState.Ended { var targetMain:CGFloat = 0 var targetDetail:CGFloat = offsetDetailRight if (self.mainView!.frame.origin.x > MGScreenWidth * 0.5) { targetMain = offsetMainRight targetDetail = 0; } let offsetMainX:CGFloat = targetMain - self.mainView!.frame.origin.x let offsetDetailX:CGFloat = -targetDetail UIView.animateWithDuration(0.25, animations: { () -> Void in self.mainView!.frame = self.mainFrameWithoffsetX(offsetMainX) self.detailView!.frame = CGRectMake(offsetDetailX, 0, self.view.frame.width, self.view.frame.height) }) } } // 返回主View的frame func mainFrameWithoffsetX(offsetX: CGFloat) -> CGRect{ var frame = self.mainView!.frame frame.origin.x += offsetX if frame.origin.x <= 0 { frame.origin.x = 0 } return frame } // 返回detailView的frame func detailFrameWithoffsetX(offsetX: CGFloat) -> CGRect{ var frame = self.detailView?.frame frame!.origin.x += (offsetX * offsetDetailRight / offsetMainRight) if frame!.origin.x >= 0 { frame!.origin.x = 0 } return frame! } // MARK: - UIGestureRecognizerDelegate override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
MGDetailViewController
// // MGDetailViewController.swift // MGSlideViewDemo // // Created by ming on 16/6/5. // Copyright © 2016年 ming. All rights reserved. // import UIKit let cellId = "cellId" class MGDetailViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { @IBOutlet weak var tableView: UITableView! var array:[String]? override func viewDidLoad() { super.viewDidLoad() self.array = ["开通会员", "QQ钱包", "个性装扮", "我的收藏", "我的相册", "我的文件", "我的名片夹"] self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: cellId) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // MARK: - UITableViewDataSource func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.array!.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier(cellId) cell!.backgroundColor = UIColor.clearColor() cell!.textLabel!.text = self.array![indexPath.row] cell!.textLabel!.textColor = UIColor.purpleColor() cell!.textLabel!.font = UIFont.systemFontOfSize(16) let indexname = self.array![indexPath.row] cell!.imageView!.image = UIImage(named: indexname) return cell! } }
MGDetailViewController.Xib
MGMainTViewController
// // MGMainTViewController.swift // MGSlideViewDemo // // Created by ming on 16/6/6. // Copyright © 2016年 ming. All rights reserved. // import UIKit class MGMainTViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "reuseIdentifier") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } // MARK: - Table view data source override func numberOfSectionsInTableView(tableView: UITableView) -> Int { // #warning Incomplete implementation, return the number of sections return 1 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // #warning Incomplete implementation, return the number of rows return 40 } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) cell.textLabel?.text = "明明就是你\(indexPath.row)行测试" return cell } }
MGMainTViewController.view
源码暂时没有放到网上,有需要再私信
文/Mg明明就是你(简书作者)
原文链接:http://www.jianshu.com/p/2acd50d8cc2c
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- Apple Swift学习教程
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 介绍 Fedora 上的 Swift
- jQuery+CSS实现一个侧滑导航菜单代码
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- iOS中UIAlertView警告框组件的使用教程
- 浅析iOS应用开发中线程间的通信与线程安全问题