swift 第九课 用tableview 做一个下拉菜单Menu
写到这里的时候,自己这个项目已经完成了一半左右,项目进度自己还是挺满意。今天又有一个新的布局,要实现个下拉菜单,刚开始写的时候,觉得会很容易,后来发现也是小错不断,
我想自己限制的自己属于写博客的初期,主要是记录错误,和喜欢撸码的朋友共同进步……
这个好多是借鉴别人博客的,免不了有搬代码的嫌疑,以后遇到在给他点赞吧……………………
这个控件主要是封装带用,方便转移到其他的项目,所以就纯粹的用代码写了……
最终呈现的效果,点击弹出,点击消失::::

先呈现调用的方法 应该会比较好:
import UIKit
class ViewController: UIViewController {
lazy var levelArr: Array<Any>? = {
return ["全部","三甲医院","三乙医院","二甲医院","二乙医院","门诊","民营医院","体检机构","私营企业"]
}()
lazy var menu: Menu = {
var me = Menu.initMenu(size: CGSize(width:UIScreen.main.bounds.size.width / 3,height:self.view.frame.size.height / 3))
self.view.addSubview(me)
return me
}()
/**
菜单的弹出 和 收回
*/
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if self.menu.isShow! == false {
let point = CGPoint(x:100,y: 100)
self.menu.popupMenu(orginPoint:point, arr: self.levelArr!)
self.menu.didSelectIndex = { [unowned self] (index:Int) in
print( "选中-- \(index) -行 -- \(self.levelArr?[index])")
}
}else{
self.menu.packUpMenu()
}
}
/*
vc 系统固有方法
*/
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
这里还是贴代码,到时看注释就好了……
import UIKit
class Menu: UIView,UITableViewDelegate,UITableViewDataSource {
/*
menu 的table 和 内容
*/
var menuTab: UITableView?
var menuArr : Array<Any>?
let cellIdentifier = "cellID"
/*
menu 选中行的方法
*/
var didSelectIndex:((_ index:Int)->Void)?
/*
加载动画效果
*/
var isShow : Bool?
var menuSize : CGSize?
class func initMenu(size:CGSize)->Menu{ let frame = CGRect(x:,y:,width:size.width,height:size.height)
let me = Menu.init(frame:frame)
me.menuSize = size
return me
} override init(frame: CGRect) {
/**
这时候 frame 的 height 设置为 0 ,是为了加载缓慢弹出的动画……
*/
let initialFrame = CGRect(x:frame.origin.x,y:frame.origin.y,width:frame.size.width,height:0.0) super.init(frame: initialFrame)
self.backgroundColor = UIColor.black menuTab = UITableView.init(frame: CGRect(x:,y:,width:frame.size.width,height:), style: .plain)
menuTab?.tableFooterView = UIView.init()
menuTab?.delegate = self
menuTab?.dataSource = self addSubview(menuTab!) menuTab?.isHidden = true
isHidden = true
isShow = false
} required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
} /*
menu 弹出菜单的方法
*/
func popupMenu(orginPoint:CGPoint,arr : Array<Any>){ if self.isShow == true {
return
}
self.isShow = true
self.isHidden = false
menuTab?.isHidden = false self.frame.origin = orginPoint
self.menuArr = arr
self.menuTab?.reloadData() self.superview?.bringSubview(toFront: self)
menuTab?.frame.size.height = 0.0
/**
这里是 弹出的动画
*/
UIView.animate(withDuration: 0.5, animations: { self.frame.size.height = (self.menuSize!.height)
self.menuTab?.frame.size.height = (self.menuSize!.height) }) { (finish) in
}
}
/**
这里是收回菜单的方法
*/
func packUpMenu() { if self.isShow == false {
return
}
self.isShow = false UIView.animate(withDuration: 0.5, animations: { self.menuTab?.frame.size.height = 0.0
self.frame.size.height = 0.0 }) { (finish) in self.isHidden = true
self.menuTab?.isHidden = true
}
} /*
tableView delegate dataSource
*/ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if ((menuArr?.count) != nil) {
return (menuArr?.count)!
}
return
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)
if cell == nil {
cell = UITableViewCell.init(style: .default, reuseIdentifier: cellIdentifier)
}
cell?.textLabel?.text = menuArr?[indexPath.row] as? String
cell?.textLabel?.textAlignment = .center
cell?.textLabel?.font = UIFont.systemFont(ofSize: 11.0) return cell!
} func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{
return
} func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ tableView.deselectRow(at: indexPath, animated: true)
/**
这里是把 选中的 indexPath 传值出去 , 关闭menu列表
*/
if (self.didSelectIndex != nil) {
self.didSelectIndex!(indexPath.row)
}
self.packUpMenu()
}
}
还没有觉得这个下拉菜单是完美的,匆匆赶觉得是够用,以后慢慢完善吧……
swift 第九课 用tableview 做一个下拉菜单Menu的更多相关文章
- 何使用CSS写出一个下拉菜单。
导航菜单是每个网站所必备的功能,也是每个学习制作网站的朋友所必须接触的,如何用css样式制作一个简单漂亮的二级下拉菜单呢? 下面为大家分享一下我的经验 方法步骤: 第一步 : 首页我们打开Subli ...
- 4-13 Webpacker-React.js; 用React做一个下拉表格的功能: <详解>
Rails5.1增加了Webpacker: Webpacker essentially is the decisions made by the Rails team and bundled up i ...
- 怎样用css写出一个下拉菜单
<style> 2 /* css*/ 3 #body{ 4 float: left; 5 } 6 #xialakuang{ 7 background-color:#f9f9f9; 8 bo ...
- 基于Bootstrap实现下图所示效果的页面,一个白底的带有两个菜单项、一个下拉菜单和一个登录表单的基本导航条
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...
- 在Android中创建一个下拉菜单
添加四个控件 TToolbar Alignment: alTop TSpeedButton Alignment: alRight StyleLookUp: detailstoolbutton Marg ...
- android一个下拉放大库bug的解决过程及思考
android一个下拉放大库bug的解决过程及思考 起因 项目中要做一个下拉缩放图片的效果,搜索了下github上面,找到了两个方案. https://github.com/Frank-Zhu/Pul ...
- 下拉菜单制作——利用CSS实现的一个实例
本文实现了一个经典的下拉菜单的制作. 首先,写出Html部分: <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- Bootstrap框架(基础篇)之按钮,网格,导航栏,下拉菜单
一,按钮 注意:虽然在Bootstrap框架中使用任何标签元素都可以实现按钮风格,但个人并不建议这样使用,为了避免浏览器兼容性问题,个人强烈建议使用button或a标签来制作按钮. 框架中提供了基础按 ...
- 织梦DedeCMS v5.7 实现导航条下拉菜单
首先将下面这段代码贴到templets\default\footer.htm文件里(只要在此文件里就行,位置无所谓) <</span>script type='text/javasc ...
随机推荐
- java线程基础巩固---线程间通信快速入门,使用wait和notify进行线程间的数据通信
之前已经对于线程同步相关的知识点进行了详细的学习,这次来学习一下线程间的通信相关的知识,话不多说直接用代码进行演练,以一个简陋的生产者消费者模型来初步了解下线程间通信是怎么一回事. 生产消费者第一版: ...
- 解决 分布式事务中HRESULT:0x8004D025 错误
最近在开发分布式事务的过程中,碰到 该伙伴事务管理器已经禁止了它对远程/网络事务的支持. (异常来自 HRESULT:0x8004D025)的错误. 后来检查到,原来是数据库服务器的MSDTC 没有设 ...
- ZZNU-OJ-2118 -(台球桌面碰来碰去,求总距离)——模拟到爆炸【超时】的不能AC的代码
ZZNU-2118 : 早安晚安,不如我先入土为安 题目描述 spring比较喜欢玩台球,因为看着台球在桌子上碰来碰去很有意思(台球撞壁反弹,入射角等于反射角),每次完美的台球入洞,都能体现他数学天才 ...
- 访问php界面访问不到,会下载文件
背景 某台服务器上有java跟php俩套环境,之前php默认用nginx80端口访问php项目.java项目上线后,80端口被占用,导致php项目页访问报错:404 报错 404, 原因一: ...
- 【1 封新邀请】想跟谷歌、七牛、kyligence 等大佬面对面的交流吗?
2020 年 1 月 4 日 - 5 日,"ECUG Con 2020"大会将于杭州举行.本次大会以"ECUG For Future"为主题,围绕五大技术主题, ...
- RHEL7-RHCE培训系列教程,让您零基础入门Linux运维
本教程是旨在帮助那些刚入门IT行业或计划从事IT行业的初学者(包括开发人员和运维人员,以及想要在Linux系统维护上提升自己的网络管理员),0基础入门Linux运维,完整学习完成本系列课程相当于培训机 ...
- 原生JS实现简单富文本编辑器2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SVN(subversion )服务端和客户端的下载安装使用
SVN(subversion)官方网站: http://subversion.apache.org/packages.html 一.服务端下载 1.百度搜关键字:subversion 进入subve ...
- BZOJ3122 随机数生成器——BSGS
题意 链接 给定 $p,\ a,\ b, \ x_1$,现有一数列 $$x_{i+1} \equiv (ax_i + b) \ mod \ p$$ 求最小的 $i$ 满足 $x_i = t$ 分析 代 ...
- BZOJ 3052/Luogu P4074 [wc2013]糖果公园 (树上带修莫队)
题面 中文题面,难得解释了 BZOJ传送门 Luogu传送门 分析 树上带修莫队板子题... 开始没给分块大小赋初值T了好一会... CODE #include <bits/stdc++.h&g ...