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&Selenium控制滚动条方法封装
Java&Selenium控制滚动条方法封装 package util; import org.openqa.selenium.JavascriptExecutor; import org.o ...
- PL/SQL查询,字段名添加中文别名,查询结果的字段名会显示问号,处理方法:
一开始查询出来的字段名显示的是???,下面说说解决方法(本人也是在网上看到的,算是重复编辑一下): -------------------------------------------------- ...
- hudson 使用节点打包出现ClassNotFoundException: org.jvnet.hudson.maven3.agent.Maven3Main 错误
java.lang.NoClassDefFoundError: org/jvnet/hudson/maven3/agent/Maven3Main Caused by: java.lang.ClassN ...
- C语言calloc()函数:分配内存空间并初始化——stm32中的应用
经常在代码中看到使用malloc来分配,然后memset清零,其实calloc更加方便,一句顶两句~ 头文件:#include <stdlib.h> calloc() 函数用来动态地分配内 ...
- LOJ #3119「CTS2019 | CTSC2019」随机立方体 (容斥)
博客链接 里面有个下降幂应该是上升幂 还有个bk的式子省略了k^3 CODE 蛮短的 #include <bits/stdc++.h> using namespace std; const ...
- PHP mysqli_commit() 函数
关闭自动提交,做一些查询,然后提交查询: <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect("localh ...
- 安装包设计-------卸载(MFC)---------知识总结
1.删除目录及其下所有文件 bool MyDeleteFile(CString Path) { // SHFILEOPSTRUCT FileOp={0}; // FileOp.fFlags = FOF ...
- 浅谈神经网络中的bias
1.什么是bias? 偏置单元(bias unit),在有些资料里也称为偏置项(bias term)或者截距项(intercept term),它其实就是函数的截距,与线性方程 y=wx+b 中的 b ...
- 微信小程序之简单记账本开发记录(六)
昨天虽然将页面成功的搭建出来 但是其中的增删改查功能没有实现,需要到逻辑页面,即js页面注册一下 效果如下图
- Ryu控制器安装部署和入门
Ryu官网简介,原滋原味 Ryu is a component-based software defined networking framework. Ryu provides software c ...