//弹窗视图
class PopView : UIView {
var selectButtonCallBack:((_ title:String)-> Void)? var contenView:UIView?
{
didSet{
setUpContent()
}
} override init(frame: CGRect) {
super.init(frame: frame)
} required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
} func setUpContent(){ if self.contenView != nil {
self.contenView?.frame.origin.y = UIScreen.main.bounds.size.height -
self.addSubview(self.contenView!)
}
self.backgroundColor = newColorWithAlpha(, , , 0.4)
self.isUserInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer.init(target: self, action: #selector(dismissView)))
//以下为添加内容,可根据需要删除以下部分
sudokuConstraints()
} @objc func dismissView(){
UIView.animate(withDuration: 0.3, animations: {
self.alpha =
}) { (true) in
self.removeFromSuperview()
self.contenView?.removeFromSuperview()
}
} func showInWindow(){
UIApplication.shared.keyWindow?.addSubview(self)
UIView.animate(withDuration: 0.3, animations: {
self.alpha = 1.0
self.contenView?.frame.origin.y = UIScreen.main.bounds.size.height -
}, completion: nil)
} //MARK: - 布局
func sudokuConstraints() -> Void {
let titleArr = ["京","沪","浙","苏","粤","鲁","晋","翼",
"豫","川","渝","辽","吉","黑","皖","鄂",
"湘","赣","闽","陕","甘","宁","蒙","津",
"贵","云","桂","琼","青","新","藏"] for (index,value) in titleArr.enumerated() {
let button = createButton(title: value)
let margin = (UIScreen.main.bounds.size.width - * )/( + )
let col = CGFloat(index % Int())
let row = CGFloat(index / Int())
let viewX = margin + col * ( + margin)
let viewY = + row * ( + ) button.frame = CGRect(x: viewX, y: viewY, width: , height: )
self.contenView!.addSubview(button)
}
} func createButton(title:String) -> UIButton {
let button = UIButton()
button.setTitle(title, for: .normal)
button.setTitleColor(newColor(, , ), for: .normal)
button.backgroundColor = .white
button.layer.masksToBounds = true
button.layer.cornerRadius = 5.0 button.addTarget(self, action: #selector(buttonClickAction(button:)), for: .touchUpInside)
return button
} @objc func buttonClickAction(button:UIButton) -> Void {
if self.selectButtonCallBack != nil {
self.selectButtonCallBack!(button.titleLabel?.text ?? "粤")
}
}
}

使用:

let popview = PopView.init(frame:UIScreen.main.bounds)
popview.contenView = UIView.init(frame: CGRect.init(x: , y: UIScreen.main.bounds.size.height - , width: UIScreen.main.bounds.size.width, height: ))
popview.contenView?.backgroundColor = newColor(, , )
popview.selectButtonCallBack = {
(title:String) -> Void in
self.righAbbreviationButton.setTitle(title, for: .normal)
popview.dismissView()
}
popview.showInWindow()

效果图:

【纯代码】Swift - 自定义底部弹窗基类(可根据需要自行扩展内容)的更多相关文章

  1. 编写高质量代码改善C#程序的157个建议——建议23:避免将List<T>作为自定义集合类的基类

    建议23:避免将List<T>作为自定义集合类的基类 如果要实现一个自定义的集合类,不应该以一个FCL集合类为基类,反而应扩展相应的泛型接口.FCL结合类应该以组合的形式包含至自定义的集合 ...

  2. 【转】C++ 虚函数&纯虚函数&抽象类&接口&虚基类

    1. 动态多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 多态性就是允许将子类类型的指针赋值给父类类型 ...

  3. C++ 虚函数&纯虚函数&抽象类&接口&虚基类(转)

    http://www.cnblogs.com/fly1988happy/archive/2012/09/25/2701237.html 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多 ...

  4. 关于TagHelper的那些事情——如何自定义TagHelper(TagHelper基类)

    写在开头 前面介绍了TagHelper的基本概念和内嵌的TagHelpers,想必大家对TagHelper都有一定的了解.TagHelper看上去有点像WebControl,但它不同于WebContr ...

  5. qt 5 小练习 纯代码制作自定义按钮

    大家都知道QT设计师中直接拖动的按钮是长方形带有圆角的图案,那我们如何来设置自定义按钮呢 要设计一个按钮,我们必须要知道按钮有什么属性,首先,按钮必须有一个位置 第二,按钮必须有一个名称.还有当我们点 ...

  6. 25.自定义mixin和基类

    很多时候业务需求并不是几个简单的mixin就可以满足,需要我们自定义mixin # get_object源码中字段查询源代码 filter_kwargs = {self.lookup_field: s ...

  7. C++ - 虚基类、虚函数与纯虚函数

    虚基类       在说明其作用前先看一段代码 class A{public:    int iValue;}; class B:public A{public:    void bPrintf(){ ...

  8. ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

    本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...

  9. 编写高质量代码改善C#程序的157个建议[勿选List<T>做基类、迭代器是只读的、慎用集合可写属性]

    前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议23.避免将List<T>作为自定义集合类的基 ...

随机推荐

  1. Python全栈day21(调用模块路径BASEDIR的正确方法)

    正常写python程序会有一个可执行的bin.py文件,假如这个文件需要导入my_module里面定义的模块,应该怎么设置sys.path 文件夹目录结构如下,因为bin不在与my_module同级目 ...

  2. Oracle分配内存的基本单位:Granule(粒度)

    在9i后,SGA的内部组件大小可以动态调整,也可以由数据库自动管理,在设置内存大小的时候,分配的基本单位是粒度(granule) granule是一段连续的虚拟内存,大小区域决SGA_MAX_SIZE ...

  3. Javascript 香港身份证号校验

    <!DOCTYPE html> <html> <head> <title>香港身份证校验码计算</title> </head> ...

  4. 品友互动大数据平台的技术演化 https://www.sohu.com/a/191202836_99982360

    品友互动大数据平台的技术演化

  5. If the parts of an organization (e.g., teams, departments, or subdivisions) do not closely reflect the essential parts of the product, or if the relationship between organizations do not reflect the r

    https://en.wikipedia.org/wiki/Conway%27s_law

  6. find-if-an-item-is-in-a-javascript-array

    http://stackoverflow.com/questions/143847/best-way-to-find-if-an-item-is-in-a-javascript-array Best ...

  7. C. Mail Stamps---cf29c(离散化,图)

    题目链接:http://codeforces.com/problemset/problem/29/C 题意就是有n(1e5)个点,找到一条能把所有的点都包含在内的路径,由于点的编号是 1e9 所以不得 ...

  8. print文档

    文档 def print(self, *args, sep=' ', end='\n', file=None): # known special case of print ""& ...

  9. NodeJS开发环境搭建

    原创作者: zero20121222 NodeJS开发环境搭建 1.安装NodeJS 1.编译环境 源代码编译器,通常 Unix/Linux平台都自带了C++的编译器(GCC/G++).如果没有,请通 ...

  10. SAMA5D3 Xplained Board

    一.烧录 1)先在官网 http://www.at91.com/linux4sam/bin/view/Linux4SAM/Sama5d3XplainedMainPage 下载  linux4sam-p ...