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 ...
随机推荐
- ZZNUOJ-2155-单身man集合-【标程做法:数位DP-1-10^8,提前暴力打表法: 砍时间复杂度到10^5】
ZZNUOJ-2155: 单身MAN集合 题目描述: 单身man们突然集结起来了,虽然我们不知道它们想要干什么.你作为单身man的首领需要管理好每一只单身man,机智的你给每一只单身man编了一个编号 ...
- 1118 DOM
目录 BOM与DOM window对象 navigator对象(了解即可) screen对象(了解即可) history对象(了解即可) location对象 弹出框 计时相关 DOM对象 DOM结构 ...
- MySQL之profiling性能分析(在5.6.14版本被丢弃)
官方建议使用information_schema.profiling. 原因是show profile 输出了查询执行的每个步骤及其花费的时间,但是结果很难快速确定哪个步骤花费的时间最多,因为输出是按 ...
- 基于 Go 的可嵌入脚本语言 zygomys
zygomys zygomys 是一种可嵌入的脚本语言. 它是一个具有面向对象风格的现代化 Lisp,提供了一个解释器和 REPL(Read-Eval-Print-Loop:也就是说,它带有一个命令行 ...
- [ES2019] Represent Collision-free String Constants as Symbols in JavaScript
ES2019 introduces the Symbol.prototype.description property. In this lesson, we'll learn why this pr ...
- 浅谈JavaScript严格模式(use strict)
"use strict" 的目的是指定代码在严格条件下执行. 严格模式下你不能使用未声明的变量. 严格模式声明 严格模式通过在脚本或函数的头部添加 "use strict ...
- HR# 5题解
T1 我傻了 前20个数暴力开桶记录,后面的每次暴力统计. #include<bits/stdc++.h> #define R register int using namespace s ...
- 09_编写脚本,实现人机<石头,剪刀,布>游戏
#!/bin/bashgame=(石头 剪刀 布)num=$[RANDOM%3]computer=${game[$num]}#通过随机数获取计算机的出拳#出拳的可能性保存在一个数组中,game[0], ...
- webuploader+文件夹上传
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- [Luogu] 树状数组
https://www.luogu.org/problemnew/show/P3374 单点修改,区间查询 #include <iostream> #include <cstdio& ...