写到这里的时候,自己这个项目已经完成了一半左右,项目进度自己还是挺满意。今天又有一个新的布局,要实现个下拉菜单,刚开始写的时候,觉得会很容易,后来发现也是小错不断,

我想自己限制的自己属于写博客的初期,主要是记录错误,和喜欢撸码的朋友共同进步……

这个好多是借鉴别人博客的,免不了有搬代码的嫌疑,以后遇到在给他点赞吧……………………

这个控件主要是封装带用,方便转移到其他的项目,所以就纯粹的用代码写了……

最终呈现的效果,点击弹出,点击消失::::

先呈现调用的方法 应该会比较好:

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的更多相关文章

  1. 何使用CSS写出一个下拉菜单。

    导航菜单是每个网站所必备的功能,也是每个学习制作网站的朋友所必须接触的,如何用css样式制作一个简单漂亮的二级下拉菜单呢? 下面为大家分享一下我的经验 方法步骤: 第一步  : 首页我们打开Subli ...

  2. 4-13 Webpacker-React.js; 用React做一个下拉表格的功能: <详解>

    Rails5.1增加了Webpacker: Webpacker essentially is the decisions made by the Rails team and bundled up i ...

  3. 怎样用css写出一个下拉菜单

    <style> 2 /* css*/ 3 #body{ 4 float: left; 5 } 6 #xialakuang{ 7 background-color:#f9f9f9; 8 bo ...

  4. 基于Bootstrap实现下图所示效果的页面,一个白底的带有两个菜单项、一个下拉菜单和一个登录表单的基本导航条

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...

  5. 在Android中创建一个下拉菜单

    添加四个控件 TToolbar Alignment: alTop TSpeedButton Alignment: alRight StyleLookUp: detailstoolbutton Marg ...

  6. android一个下拉放大库bug的解决过程及思考

    android一个下拉放大库bug的解决过程及思考 起因 项目中要做一个下拉缩放图片的效果,搜索了下github上面,找到了两个方案. https://github.com/Frank-Zhu/Pul ...

  7. 下拉菜单制作——利用CSS实现的一个实例

    本文实现了一个经典的下拉菜单的制作. 首先,写出Html部分: <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  8. Bootstrap框架(基础篇)之按钮,网格,导航栏,下拉菜单

    一,按钮 注意:虽然在Bootstrap框架中使用任何标签元素都可以实现按钮风格,但个人并不建议这样使用,为了避免浏览器兼容性问题,个人强烈建议使用button或a标签来制作按钮. 框架中提供了基础按 ...

  9. 织梦DedeCMS v5.7 实现导航条下拉菜单

    首先将下面这段代码贴到templets\default\footer.htm文件里(只要在此文件里就行,位置无所谓) <</span>script type='text/javasc ...

随机推荐

  1. ZZNUOJ-2155-单身man集合-【标程做法:数位DP-1-10^8,提前暴力打表法: 砍时间复杂度到10^5】

    ZZNUOJ-2155: 单身MAN集合 题目描述: 单身man们突然集结起来了,虽然我们不知道它们想要干什么.你作为单身man的首领需要管理好每一只单身man,机智的你给每一只单身man编了一个编号 ...

  2. 1118 DOM

    目录 BOM与DOM window对象 navigator对象(了解即可) screen对象(了解即可) history对象(了解即可) location对象 弹出框 计时相关 DOM对象 DOM结构 ...

  3. MySQL之profiling性能分析(在5.6.14版本被丢弃)

    官方建议使用information_schema.profiling. 原因是show profile 输出了查询执行的每个步骤及其花费的时间,但是结果很难快速确定哪个步骤花费的时间最多,因为输出是按 ...

  4. 基于 Go 的可嵌入脚本语言 zygomys

    zygomys zygomys 是一种可嵌入的脚本语言. 它是一个具有面向对象风格的现代化 Lisp,提供了一个解释器和 REPL(Read-Eval-Print-Loop:也就是说,它带有一个命令行 ...

  5. [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 ...

  6. 浅谈JavaScript严格模式(use strict)

    "use strict" 的目的是指定代码在严格条件下执行. 严格模式下你不能使用未声明的变量. 严格模式声明 严格模式通过在脚本或函数的头部添加 "use strict ...

  7. HR# 5题解

    T1 我傻了 前20个数暴力开桶记录,后面的每次暴力统计. #include<bits/stdc++.h> #define R register int using namespace s ...

  8. 09_编写脚本,实现人机<石头,剪刀,布>游戏

    #!/bin/bashgame=(石头 剪刀 布)num=$[RANDOM%3]computer=${game[$num]}#通过随机数获取计算机的出拳#出拳的可能性保存在一个数组中,game[0], ...

  9. webuploader+文件夹上传

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...

  10. [Luogu] 树状数组

    https://www.luogu.org/problemnew/show/P3374 单点修改,区间查询 #include <iostream> #include <cstdio& ...