import UIKit
/*
总结:1:给UIButton写分类,新建文件swiftFile,一般为了区分起名字都是名字-Extension,要想调用UI控件需要导入 import UIKit框架,然后给系统的类写分类:extension UIButton {},提供类方法或是构造函数的方法,把与该控件有关的业务逻辑全封装在分类的内部。2:封装方法:类方法:都是以class开头,class func 函数名(参数)->返回值类型{业务逻辑代码,return 返回值}:例子: class func createButton(imageName:String,backgroundImageName:String) -> UIButton {},其中声明函数的时候,没有参数也加(),返回值只写类型。分类不用private和fileprivate修饰 3:构造函数方法:利用便利构造函数:
convenience init(_ imageName:String,bgImageName:String)
convenience为便利构造函数,便利构造函数通常用在对系统的类进行构造函数的扩充时使用
遍历构造函数的特点
1.遍历构造函数通常都是写在extension里面
2.遍历构造函数init前面需要加载convenience
3.在遍历构造函数中需要明确的调用self.init() convenience init(_ imageName:String,bgImageName:String) { //1:必须首先调用self.init()
self.init() //2:设置按钮
let higlingStr = "_highlighted" //2:设置按钮的bg图片与普通图片
setImage(UIImage(named:imageName), for: .normal)
setImage(UIImage(named:imageName + higlingStr), for: .highlighted)
setBackgroundImage(UIImage(named:bgImageName), for: .normal)
setBackgroundImage(UIImage(named:bgImageName+higlingStr), for: .highlighted) //3:设置按钮的尺寸
sizeToFit() }
注意:1:在构造函数中不用写返回值,因为系统默认会返回 2:在类中调用该类的方法可以省去self去调用 3:系统的第一个参数默认为内部参数,从第二个参数开始即为内部参数又为外部参数,要想让参数都变为内部参数,则在参数的前面加_+空格,仿照苹果系统的写法 2:懒加载:1:懒加载时用关键字lazy,用private或是fileprivate来修饰 2:懒加载有两种写法:1:直接初始化 如方法1 2:利用闭包懒加载: fileprivate lazy var composeBtn = {return 业务逻辑+返回值}(); ,苹果建议一般定义变量都使用懒加载 3:在定义变量或是属性的时候,必须给定明确的初始化值或是可选类型,后面去赋值,否则会报错
1:懒加载发布按钮,提供两种创建对象的方法:1:类方法,用类点语法调用
fileprivate lazy var composeBtn : UIButton = UIButton.createButton(imageName: "tabbar_compose_icon_add", backgroundImageName: "tabbar_compose_button")
2:对象方法获得button的实例:
fileprivate lazy var composeBtn = UIButton("tabbar_compose_icon_add", bgImageName: "tabbar_compose_button") 3:代码的书写:1:在定义的类中定义属性时,可以懒加载属性,也可以定义成可选类型或是直接给属性赋值,但是定义属性的时候需要考虑用不用private或是fileprivate修饰 2:在viewDidLoad中抽方法封装调用,封装的方法写在该类的extension扩展中 3:若是extension扩展中涉及某些业务逻辑的处理则写成系统类的分类(类方法或是构造函数方法),工具类,继承
2:在分类或是类中定义方法的时候,也要考虑用private或是fileprivate修饰,对按钮事件的监听:composeBtn.addTarget(self, action: #selector(MainViewController.composeBtnClic), for: .touchUpInside)
selector用#selector来包装,按钮点击事件的方法用类去调用该方法,枚举用.+枚举值,其中按钮的点击方法也写在extension的扩展中
3:封装按钮的点击事件:
extension MainViewController { @objc fileprivate func composeBtnClic() { DLog(message: "hello--word") } 事件监听本质发送消息.但是发送消息是OC的特性
将方法包装成@SEL --> 类中查找方法列表 --> 根据@SEL找到imp指针(函数指针) --> 执行函数
如果swift中将一个函数声明称private,fileprivate那么该函数不会被添加到方法列表中
如果在private前面加上@objc,那么该方法依然会被添加到方法列表中 */
class MainViewController: UITabBarController { // MARK:- 懒加载属性
fileprivate lazy var composeBtn = UIButton("tabbar_compose_icon_add", bgImageName: "tabbar_compose_button") // MARK:- 系统回调函数
override func viewDidLoad() {
super.viewDidLoad() //1:创建中间发布按钮
setupComposeBtn() }
} // MARK:- 设置UI界面
extension MainViewController { /// 设置发布按钮
fileprivate func setupComposeBtn() { // 1.将composeBtn添加到tabbar中
tabBar.addSubview(composeBtn) // 2.设置位置
composeBtn.center = CGPoint(x: tabBar.center.x, y: tabBar.bounds.size.height * 0.5) //3:设置监听
composeBtn.addTarget(self, action: #selector(MainViewController.composeBtnClic), for: .touchUpInside)
} } //MARK:-发布按钮的监听点击
extension MainViewController { @objc fileprivate func composeBtnClic() { DLog(message: "hello--word") } }

发布按钮的扩展:

import UIKit

extension UIButton {

  //MARK:-1:提供类方法
class func createButton(imageName:String,backgroundImageName:String) -> UIButton { //1:创建button
let button = UIButton()
let higlingStr = "_highlighted" //2:设置按钮的bg图片与普通图片
button.setImage(UIImage(named:imageName), for: .normal)
button.setImage(UIImage(named:imageName + higlingStr), for: .highlighted)
button.setBackgroundImage(UIImage(named:backgroundImageName), for: .normal)
button.setBackgroundImage(UIImage(named:backgroundImageName+higlingStr), for: .highlighted) //3:设置按钮的尺寸
button.sizeToFit() //4:返回按钮
return button } //MARK:-2:提供对象方法:在构造函数的对象方法中,self就是当前调用方法的对象,所以不用再去创建对象
convenience init(_ imageName:String, bgImageName:String) { //1:必须首先调用self.init()
self.init() //2:设置按钮
let higlingStr = "_highlighted" //2:设置按钮的bg图片与普通图片
setImage(UIImage(named:imageName), for: .normal)
setImage(UIImage(named:imageName + higlingStr), for: .highlighted)
setBackgroundImage(UIImage(named:bgImageName), for: .normal)
setBackgroundImage(UIImage(named:bgImageName+higlingStr), for: .highlighted) //3:设置按钮的尺寸
sizeToFit() } }

swift项目第六天:中间发布按钮的封装以及监听点击事件的更多相关文章

  1. IOS之UI--自定义按钮实现代理监听点击事件

    前言: Objective-C提供的按钮监听事件的方法是 不含参数的监听方法 [button实例对象 addTarget:self action:@selector(func) forControlE ...

  2. ASP.NET Core 发布之后通过命令控制监听地址和环境变量

    添加Command支持 新建一个ASP.NET Core 项目,打开Program.cs 添加下面的代码: public class Program { public static void Main ...

  3. [Swift通天遁地]三、手势与图表-(1)监听屏幕上触摸事件的各种状态

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. [Swift通天遁地]三、手势与图表-(2)监听手势事件自由拖动图像视图

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. [转]android:动态创建多个按钮 及 批量设置监听

    之前投机取巧,先创建好多个按钮,再根据需要的数量进行部分隐藏,不过还是逃不过呀. 这样根本无法批量地 findId,批量地 设置监听. 所以今天还是认认真真地研究回“动态创建按钮”,终于,通过不断尝试 ...

  6. 项目遇到的小问题(关于vue-cli中js点击事件不起作用和iconfont图片下载页面css样式乱的解答)

     第一个:关于vue-cli中js点击事件不起作用 在vue的methods方法queryBtnFun()中拼接html和click操作事件的时候,发现点击事件一起未起作用: 后来发现是DOM执行顺序 ...

  7. spring-boot rabbitMq 完整项目搭建,包括创建、发送、监听

    写在开始 rabbitMq 代码按照三部分介绍 第一部分 交换机和队列的创建 第二部分 消息发送 第三部分 消息监听 第一部分 1 建立queue 2 建立exchange 3 exchange绑定q ...

  8. Swift - 推送之本地推送(UILocalNotification)添加Button的点击事件

    上一篇讲到的本地推送是普通的消息推送,本篇要讲一下带按钮动作的推送消息 import UIKit @UIApplicationMain class AppDelegate: UIResponder, ...

  9. AJ学IOS 之微博项目实战(12)发送微博自定义工具条代理实现点击事件

    AJ分享,必须精品 一:效果 二:封装好的工具条 NYComposeToolbar.h 带代理方法 #import <UIKit/UIKit.h> typedef enum { NYCom ...

随机推荐

  1. js ---- 函数防抖

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  2. shutdown---系统关机

    shutdown命令用来系统关机命令.shutdown指令可以关闭所有程序,并依用户的需要,进行重新开机或关机的动作. 语法 shutdown(选项)(参数) 选项 -c:当执行“shutdown - ...

  3. 今日SGU 5.2

    SGU123 题意:求和 收获:无 #include<bits/stdc++.h> #define de(x) cout<<#x<<"="< ...

  4. 车牌识别--S5PV210測试第二次优化

    优化: 1.RGB转HSV 浮点运算改成定点运算: 2.匹配模板由图片改成C语言数组: 3.优化測试BMP车牌图片读取(两层for循环改为一层for循环). 总体相比优化之前时间降低110ms左右. ...

  5. Leetcode47: Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome. 推断一个链表是不是回文的,一个比較简单的办法是把链表每一个结点的值存在vect ...

  6. Mysql数据库存储引擎--转

    原文地址:http://pangge.blog.51cto.com/6013757/1303893 简单介绍 存储引擎就是指表的类型.数据库的存储引擎决定了表在计算机中的存储方式.存储引擎的概念是My ...

  7. android audio

    package com.javacodegeeks.android.audiocapturetest; import java.io.IOException; import android.media ...

  8. Vue的学习--遇到的一些问题和解决方法

    包括: 1.Missing space before function parentheses 2.如何给.vue文件的页面添加css 3.如何给.vue文件页面里的元素添加监听器 4.如何为每一个页 ...

  9. JavaScript的字符串、数组以及DOM操作总结

    (一)JavaScript字符串操作 JavaScript的字符串就是用' '或" "括起来的字符表示,日常的学习中有时候需要对字符串进行相关的操作.例如要获取字符串某个指定位置的 ...

  10. django 简单会议室预约(4)

    基本的配置已经完成了,来看看最重要的views.py 先看看简单的注册登录功能,在django里有一个专门的模块用来验证用户信息 :所以只需要调用就好了: #-*-coding:utf-8 -*- f ...