ios开发之UI学习第一周总结
UIView基本属性、方法、视图关系、动画
基本属性和方法
UIView:是iOS中所有视图(控件)直接/间接的父类;所以UIView的属性和方法,对于其他类型的视图都有效
视图:在屏幕上能看见的所有的东西都属于视图
1.首先要创建UIview的对象
let redView = UIView.init()
如果想要将视图展示在屏幕上的两个必要条件:
(a).必须设置坐标和大小(默认坐标是(0,0),默认大小(0,0))
(b).将视图添加到已经展示子屏幕上的视图上
2.设置frame属性(由坐标(下,y)和大小(width,height)两部分组成)
redView.frame = CGRect(x: 10, y: 10, width: 100, height: 100)
注意iOS中所有的结构体都有一个对应的Make方法用来快速的创建一个结构体变量
redView.frame = CGRectMake(10, 10, 100, 100)
3.将视图添加到界面
self.view.addSubview(redView)
4.设置背景颜色
redView.backgroundColor = UIColor.redColor()
创建背景颜色的方法有很多种,特别推荐三原色创建法,通过三原色来创建任意你想要的颜色,前提是你要知道红绿蓝的值,这个可以通过(数码测色计)来查看
下面就是我们创建的视图
![屏幕快照 2016-08-27 上午10.43.20.png](/Users/macbook/Desktop/屏幕快照 2016-08-27 上午10.43.20.png)
下面我们来聊聊视图的形变(transform)
当前视图发生形变,那么添加到当前视图上的所有的视图会跟着一起形变
a.缩放
//参数1:x方向上的缩放比例
//参数2: y方向上的缩放比例
redView.transform = CGAffineTransformMakeScale(0.8, 2.5)
b.旋转
//参数:旋转角度(圆周率对应的角度值)
redView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_4 / 2))
c.平移
//参数1:在x方向上平移的距离,负值->向左移,正值->向右移
//参数2:在y方向上平移的距离,负值->向上移,正值->向下移
redView.transform = CGAffineTransformMakeTranslation(0, 300)
d.多个形变同时发生(在另外一个形变的前提下形变)
以下是在平移的前提下旋转
//参数1:另外一个形变
//参数2:旋转角度
redView.transform = CGAffineTransformRotate(CGAffineTransformMakeScale(0.5, 0.5), CGFloat(M_PI_4 / 2))
以下我们来探讨父子视图关系
1.一个视图只有一个父视图,可以有多个子视图
2.连续将同一个视图添加到两个视图上,最后一次添加有效
我们将一个视图添加到界面的时候会就会完美地呈现父子视图
self.view.addSubview(redView)
selft.view就是redView的父视图; redView就是self.view的子视图
4.设置tag值,默认是0;设tag值的时候,值必须大于0;tag的作用:用来区分界面上不同的视图
yellowView.tag = 101
如果我们想要通过tag值拿到指定的子视图并且可以对它的尺寸进行修改
let subView2 = self.view.viewWithTag(101)
subView2?.frame.origin.y = 100
下面我们来接触UIView动画
UIView动画就是视图出现在界面上的出现方式,有从某个方向直接弹出来的,有的不停的在放大和缩小有的是慢慢的滑出来
视图我们就不创建了;直接写动画方法,到时候直接调用就行
方法1.(在移动的过程中将视图缩小并且改变视图的颜色)
func UIViewAnimation1() {
//功能:执行这个方法前视图的状态,动画的切换到闭包里面设置的最终状态
//参数1:动画时间(单位:秒)
//参数2:闭包,设置动画结束时视图的状态
UIView.animateWithDuration(2) {
//在这儿来设置视图动画结束时的状态
//a.动画的改变视图的坐标
self.subView.frame.origin.y = 50
//b.动画的改变视图的大小
//self.subView.frame.size = CGSizeMake(50, 50)
self.subView.transform = CGAffineTransformMakeScale(0.5, 0.5)
//c.动画的改变视图的背景颜色
self.subView.backgroundColor = UIColor.redColor()
//d.动画的改变视图的透明度(0~1)
self.subView.alpha = 0.3
}
}
方法2.(在固定的范围内循环移动)
func UIViewAnimation3() {
//参数1:动画时间
//参数2:延迟时间
//参数3:选项,Repeat->动画重复执行,Autoreverse->自动回到动画开始的状态
//参数4:设置动画结束时视图状态的闭包
//参数5:整个动画过程完成后需要执行的闭包
UIView.animateWithDuration(2, delay: 1, options: [ .Repeat, .Autoreverse], animations: {
self.subView.transform = CGAffineTransformMakeTranslation(0, -200)
}, completion: nil)
}
方法3:(在原地像弹簧一样缩放)
func UIViewAnimation4() {
//参数1:动画时间
//参数2:延迟时间
//参数3:弹簧的压力系数
//参数4:弹簧初始的加速度
//参数5:选项
//参数6:设置动画结束时视图的状态
//参数7:动画结束后要执行的闭包
UIView.animateWithDuration(2, delay: 1, usingSpringWithDamping: 0.1, initialSpringVelocity: 0, options: [ .Repeat, .Autoreverse], animations: {
//注意:对于有圆角的视图,改变大小而又不影响形状,只能通过形变去缩放。不能直接改变frame中的size
self.subView.transform = CGAffineTransformMakeScale(0.5, 0.5)
}, completion: nil)
}
UILabel基础
从UIView继承下来的属性
1.创建UILabel对象
let label = UILabel.init(frame: CGRectMake(100, 100, 200, 300))
2.添加到界面上
self.view.addSubview(label)
3.设置背景颜色
label.backgroundColor = UIColor.yellowColor()
1.设置字体(字体大小默认是17)
label.font = UIFont.systemFontOfSize(24)
2.使用系统字体,设置字体大小和粗细
//参数1:字体大小
//参数2;字体粗细(0~1)
label.font = UIFont.systemFontOfSize(17, weight: 0.2)
3.使用斜体,设置字体大小
label.font = UIFont.italicSystemFontOfSize(17)
4.设置字体颜色
label.textColor = UIColor.redColor()
5.设置阴影颜色
label.shadowColor = UIColor.blackColor()
6.置阴影的偏移效果
label.shadowOffset = CGSizeMake(-1, -1)
7.设置字体的对齐模式(默认是左对齐)
label.textAlignment = .Center
8.设置换行模式
//ByWordrapping -> 以单词为单位换行
//ByCharWrapping ->以字符为单位换行
label.lineBreakMode = .ByCharWrapping
UIImageView基础
从UIView继承下来的属性和方法
1.创建UIImageView对象
let imageView = UIImageView.init(frame: CGRectMake(0, 100, 300, 300))
2.添加到界面上
self.view.addSubview(imageView)
3.设置背景颜色
imageView.backgroundColor = UIColor.yellowColor()
UIImageView专有的属性
1.image属性
a.通过图片名去创建一个图片对象(注意:如果图片的格式是png,那么图片名的后缀可以省略。但是其他格式的图片的图片名的后缀不能省略)
imageView.image = UIImage.init(named: "back2.jpg")
b.通过图片路径去创建一个图片对象
将文件(除了swift文件)放到工程中,实质是放到了当前应用程序的包文件中;
想要拿到工程中的图片路径先要获取包文件;); 就要拿到包中的指定的文件的路径
let imagePath = NSBundle.mainBundle().pathForResource("back2", ofType: "jpg")
imageView.image = UIImage.init(contentsOfFile: imagePath!)
c.c.比较通过图片名和通过图片地址创建图片对象的两种方法:
(1).通过图片名创建的图片对象在程序结束后才会被销毁,只会创建一次;通过图片地址创建图片对象是当前图片对象不再使用的时候就销毁
(2)使用图片名创建图片的情况:创建小图标的时候;在工程中会重复使用的图片
(3)使用图片地址创建图片对象的情况:不会频繁的在多个界面出现的大图
3.内容模式
imageView.contentMode = .ScaleToFill
UIImageView帧动画
效果描述:使用几张帧动画图片做到让小鸟从模拟器上从左侧飞向右侧
1.创建一个定时器,并且自动开启
参数1:定时时间
参数2:调用方法的对象
参数3:存储定时时间到了以后需要调用的方法(可以不带参也可以带参,但是如果带参只能带一个参,并且参数类型是NSTimer类型)
参数4:给当前的NSTimer的userInfo属性赋的值(一般写nil)
参数5:是否重复
功能:每隔0.1秒,self去调用一次timerAction方法
NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "timerAction:", userInfo: "aaa", repeats: true)
2.定时器方法
//参数:当前定时器
func timerAction(timer:NSTimer) {
print(timer.userInfo)
self.imageView.frame.origin.x += 3
//判断小鸟是否飞到了屏幕边缘
if self.imageView.frame.origin.x >= self.view.bounds.width - self.imageView.bounds.width {
return
//暂停定时器
timer.fireDate = NSDate.distantFuture()
//让定时器继续
timer.fireDate = NSDate.distantPast()
}
}
3.创建imageview
func creatImageView() {
//1.创建一个UIImageView对象
//通过图片去创建一个imageView;UIImageView的大小是图片的大小,坐标是(0,0)
imageView = UIImageView.init(frame: CGRectMake(100, 100, 50, 50))
imageView = UIImageView.init(image: UIImage.init(named: "DOVE 1.png"))
//2.显示在界面上
self.view.addSubview(imageView)
//3.使用UIImageView播放帧动画
//a.设置帧动画数组
//创建一个空的图片数组
var imageArray = [UIImage]()
//通过for循环创建18张图片
for item in 1...18 {
//拼接图片名
let imageName = "DOVE \(item).png"
//创建对应的图片
let image = UIImage.init(named: imageName)
//将图片存到数组中
imageArray.append(image!)
}
imageView.animationImages = imageArray
//b.设置动画时间,单位秒
imageView.animationDuration = 1
//c.设置动画的重复次数(默认是0->无限循环)
imageView.animationRepeatCount = 0
//d.开始动画
imageView.startAnimating()
}
UIButton基础以及自制UIButton
Button有很多种,有图片按钮、文字按钮、图片文字按钮
1.图片按钮
func imageButton() {
//1.创建一个按钮对象
let imageBtn = UIButton.init(frame: CGRectMake(100, 200, 80, 80))
//2.添加到界面上
self.view.addSubview(imageBtn)
//3.设置图片
//参数1:图片
//参数2:状态(正常、高亮、选中、不可用)
imageBtn.setImage(UIImage.init(named: "luffy1"), forState: .Normal)
//4.添加按钮点击事件
imageBtn.addTarget(self, action: "btnAction:", forControlEvents: .TouchUpInside)
}
上边的btnAction是调用的下边的方法,文字按钮和图片文字按钮一样是调用了这个方法
//MARK: - 按钮点击
func btnAction(btn:UIButton) {
//CGFloat(arc4random()%256)/255
//设置按钮的背景颜色是随机色
btn.backgroundColor = UIColor.init(red: CGFloat(arc4random()%256)/255, green: CGFloat(arc4random()%256)/255, blue: CGFloat(arc4random()%256)/255, alpha: 1)
}
2.下边是文字按钮,详细解释写在代码里
//MARK: - 文字按钮
func titleButton() {
//UIButton:UIControl:UIView
//UIButton上有一个titleLabel专门负责按钮上文字的显示;有一个imageView专门负责按钮上图片的显示
//=========UIView的属性和方法========
//1.创建UIButton对象
let titleBtn = UIButton.init(frame: CGRectMake(100, 100, 100, 50))
//2.添加到界面上
self.view.addSubview(titleBtn)
//3.设置背景颜色
titleBtn.backgroundColor = UIColor.redColor()
//=========UIButton专有的属性和方法======
//1.设置按钮上显示的文字(给不同的状态设置不一样的文字)
//参数1:想要在按钮上显示的文字
//参数2:状态
//Normal -> 正常状态(按钮正常显示,没有被点击或者按下的时候)
//Highlighted ->高亮(按钮被按下,没有弹起来的时候的状态)
//Selected -> 选中状态
//Disabled -> 不可用状态(按钮不能被点击)
titleBtn.setTitle("正常", forState: .Normal)
titleBtn.setTitle("高亮", forState: .Highlighted)
titleBtn.setTitle("选中", forState: .Selected)
titleBtn.setTitle("不可用", forState: .Disabled)
//2.设置当前按钮是否选中(默认是false->非选中)
titleBtn.selected = false
//3.设置当前按钮是否可用(默认是true->可用)
titleBtn.enabled = true
//4.设置文字颜色(给不同的状态设置不一样的颜色)
titleBtn.setTitleColor(UIColor.yellowColor(), forState: .Normal)
titleBtn.setTitleColor(UIColor.lightGrayColor(), forState: .Disabled)
//注意:按钮上的文字和文字颜色,必须通过对应的set方法去根据状态去设置。其他和文字相关的属性可以通过拿到titleLabel去设置
//5.设置按钮上的文字字体
titleBtn.titleLabel?.font = UIFont.systemFontOfSize(12)
//6.设置按钮上的文字的对齐方式
titleBtn.titleLabel?.textAlignment = .Right
//!!!7.给按钮添加事件
//参数1:调用方法的对象
//参数2:指定事件发生后参数1要去调用的方法(这个方法可以不带参,如果带参只能带一个,并且参数的类型是UIButton类型),实参就是当前添加事件的按钮本身
//参数3:事件
//TouchDown -> 按下事件
//功能:当按钮被按下的时候,self会去调用btnAction方法
//TouchUpInside ->按下弹起事件
//功能:当按钮被按下弹起来的时候,self会去调用btnAction方法
titleBtn.addTarget(self, action: "btnAction:", forControlEvents: .TouchUpInside)
}
3.最后讲讲图片文字按钮
//MARK: - 图片文字按钮
func imageTitleBtn() {
//a.同时设置title和image属性,显示是图片在左,文字在右
//b.同时设置title和groundImage,显示是图片在下层,文字在上层
//1.创建一个按钮对象
let btn1 = UIButton.init(frame: CGRectMake(100, 300, 100, 50))
self.view.addSubview(btn1)
//2.设置title
btn1.setTitle("标题", forState: .Normal)
btn1.setTitleColor(UIColor.whiteColor(), forState: .Normal)
//3.设置图片
//btn1.setImage(UIImage.init(named: "luffy1"), forState: .Normal)
btn1.setBackgroundImage(UIImage.init(named: "luffy2"), forState: .Normal)
//4.添加事件
btn1.addTarget(self, action: "btnAction:", forControlEvents: .TouchUpInside)
}
UITextField基础
textfield就是手机界面上要你输入文字或者登录帐号时出现的那个条形框
快捷键:command键 + k 弹出或者收起模拟器上的键盘
UITextField的属性和方法
1.创建UITextField对象
let textField = UITextField.init(frame: CGRectMake(100, 100, 200, 50))
2.添加到界面上
self.view.addSubview(textField)
3.设置背景颜色
textField.backgroundColor = UIColor.yellowColor()
![屏幕快照 2016-08-27 下午2.51.21.png](/Users/macbook/Desktop/屏幕快照 2016-08-27 下午2.51.21.png)
控件大集合
1.开关
import UIKit
//生命周期和属性
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.creatSwitch()
}
}
//创建控件
extension ViewController{
//1.开关
func creatSwitch(){
//1.创建开关对象
let sw = UISwitch.init(frame: CGRectMake(100, 100, 100, 50))
//2.添加到界面上
self.view.addSubview(sw)
//3.核心属性:开关状态(默认是false)
//设置开关的状态
sw.on = true
sw.setOn(false, animated: true)//变成状态的时候有动画效果
//拿到当前的状态
print(sw.on)
//4.核心方法
//参数1:调用方法的对象;参数2:指定的事件发生后参数1要去调用的方法对应的selector;参数3:事件
// 功能:当开关的值(开关的状态)发生改变的时候,self回去调用switchaction方法
sw.addTarget(self, action: #selector(ViewController.switchAction(_:)), forControlEvents: .ValueChanged)
//5.设置开关开的状态的颜色
sw.onTintColor = UIColor.redColor()
//6.关的时候边框的颜色
sw.tintColor = UIColor.purpleColor()
//7.开关滑块的颜色
sw.thumbTintColor = UIColor.yellowColor()
//sw.onImage = UIImage.init(named: <#T##String#>)
}
}
//事件响应
extension ViewController{
//1.开关事件
func switchAction(sw:UISwitch){
if sw.on{
print("开关打开")
}
else{
print("开关关闭")
}
}
}
开关可以左右滑动
![屏幕快照 2016-08-27 下午2.55.12.png](/Users/macbook/Desktop/屏幕快照 2016-08-27 下午2.55.12.png)
2.滑块
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.creatSlider()
}
}
extension ViewController{
func creatSlider(){
//1.创建对象
let slider = UISlider.init(frame: CGRectMake(100, 100, 200, 50))
//2.添加到界面上
self.view.addSubview(slider)
//3.核心属性:值(滑块位置对应的值)
//value:滑块位置对应的值(默认是0---1)
//设置滑块的最大最小值
slider.minimumValue = 0
slider.maximumValue = 100
//滑块刚开始的时候的位置
slider.value = 50
//4.核心方法
slider.addTarget(self, action: #selector(ViewController.sliderAction(_:)), forControlEvents: .ValueChanged)
//5.1滑块右边线条的颜色
slider.maximumTrackTintColor = UIColor.blackColor()
//5.2滑块左边线条的颜色
slider.minimumTrackTintColor = UIColor.redColor()
//5.3滑块滑块的颜色
slider.thumbTintColor = UIColor.greenColor()
//6.是否连续改变
slider.continuous = false
// //7.点击牛眼睛后滑条滑块的图片
// slider.setThumbImage(UIImage.init(named: "back2.jpg"), forState: .Normal)
//
}
}
extension ViewController{
func sliderAction(slider:UISlider){
print(slider.value)
}
}
![屏幕快照 2016-08-27 下午2.59.19.png](/Users/macbook/Desktop/屏幕快照 2016-08-27 下午2.59.19.png)
3.与滑块相似但是不同的进度条
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.creatProgress()
}
}
extension ViewController{
func creatProgress(){
//1.创建进度条对象
let progress = UIProgressView.init(frame: CGRectMake(100, 300, 300, 20))
progress.tag = 100
//2.添加到界面
self.view.addSubview(progress)
//3.核心属性
//进度(0--1)
//设置当前进度
progress.progress = 0.5
progress.setProgress(0.6, animated: true)
//颜色相关
progress.progressTintColor = UIColor.blackColor()
progress.trackTintColor = UIColor.greenColor()
//图片相关
}
}
![屏幕快照 2016-08-27 下午3.03.03.png](/Users/macbook/Desktop/屏幕快照 2016-08-27 下午3.03.03.png)
4.下面是个自定义的一个分段选择器,基本上所有手机上都有的
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// //系统的分段选择器
// let segement = UISegmentedControl.init(items: ["1","2","3"])
// segement.frame = CGRectMake(7, 100,400, 50)
// self.view.addSubview(segement)
// segement.selectedSegmentIndex = 1
// segement.addTarget(self, action: #selector(ViewController.action), forControlEvents: .ValueChanged)
//
//
//自己的分段选择器
let selfSegement = YTSegmentControl.init(items: ["海贼","路飞","火影忍者","名侦探柯南"])
selfSegement.frame = CGRectMake(7, 0,400, 50)
selfSegement.titleColor = UIColor.redColor()
selfSegement.titleSelectedColor = UIColor.greenColor()
selfSegement.selectedSegmentIndex = 1
selfSegement.addTarget(self, action: #selector(ViewController.selfAction(_:)))
self.view.addSubview(selfSegement)
}
func selfAction(segement:YTSegmentControl) {
print("自己的选择器在做切换")
print(segement.selectedSegmentIndex)
}
func action() {
print("系统的选择器在做切换")
}
}
import UIKit
let BtnTag = 100
//MARK:222 - 提供给外部使用的方法
extension YTSegmentControl{
//保存target和action值
func addTarget(target:AnyObject?, action:Selector) {
self.target = target
self.action = action
}
}
class YTSegmentControl: UIView {
///111.items
private var items:[String]
///5.滑块
private var slider = UIView()
///6.保存target
private var target: AnyObject? = nil
///7.保存action
private var action: Selector? = nil
//MARK: - 构造方法
init(items:[String]){
self.items = items
//CGRectZero ->坐标是(0,0),大小是(0,0)
super.init(frame: CGRectZero)
//创建items中的每个数组元素对应的按钮
self.creatSubView()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// //MARK: - 属性
///1.666当前被选中的按钮的下标
var selectedSegmentIndex = 0{
//将要将新值赋给selectedSegmentIndex。这个selectedSegmentIndex还是原来
willSet{
//1.先将原来选中的按钮变成非选中状态
let btn1 = self.viewWithTag(BtnTag
+ selectedSegmentIndex) as! UIButton
btn1.selected = false
//2.将指定的按钮变成选中状态
//newValue -> 将要赋给当前属性的那个新的值
let btn2 = self.viewWithTag(BtnTag + newValue) as! UIButton
btn2.selected = true
}
//777已经给selectedSegmentIndex赋值
didSet{
UIView.animateWithDuration(0.2) {
self.slider.frame.origin.x = CGFloat(self.selectedSegmentIndex) * self.slider.frame.size.width
}
}
}
///2.888文字选中的颜色
var titleSelectedColor = UIColor.blueColor(){
didSet{
//更新滑块的背景颜色
self.slider.backgroundColor = self.titleSelectedColor
for item in self.subviews {
if item.tag >= BtnTag {
let btn = item as! UIButton
//改变按钮的文字颜色
btn.setTitleColor(self.titleSelectedColor, forState: .Selected)
}
}
}
}
///3.999文字颜色
var titleColor = UIColor.blackColor(){
//每次从外部给titleColor属性赋值的时候,都需要用最新的titleColor的值去更新按钮的文字颜色
didSet{
for item in self.subviews {
if item.tag >= BtnTag {
let btn = item as! UIButton
//改变按钮的文字颜色
btn.setTitleColor(self.titleColor, forState: .Normal)
}
}
}}
}
//MARK:555 - 计算子视图的frame
extension YTSegmentControl{
override func layoutSubviews() {
super.layoutSubviews()
//当前分段选择器的宽和高
let segementW = self.frame.size.width
let segementH = self.frame.size.height
//1.计算按钮的frame
let btnW = segementW/CGFloat(self.items.count)
let btnH = segementH
let btnY: CGFloat = 0
//遍历所有的子视图
var i: CGFloat = 0
for item in self.subviews {
//找到其中的按钮
if item.tag >= BtnTag {
let btnX = i * btnW
item.frame = CGRectMake(btnX, btnY, btnW, btnH)
//找到一个按钮i加1
i += 1
}
}
//2.计算滑块的frame
let sliderX = CGFloat(self.selectedSegmentIndex) * btnW
let sliderH: CGFloat = 2
let sliderY = segementH - sliderH
let sliderW = btnW
self.slider.frame = CGRectMake(sliderX, sliderY, sliderW, sliderH)
}
}
//MARK:333 - 创建子视图
extension YTSegmentControl{
func creatSubView() {
//1.创建按钮
for (i,item) in self.items.enumerate() {
//创建按钮不设置frame属性
let btn = UIButton.init()
//设置文字
btn.setTitle(item, forState: .Normal)
//设置tag值
btn.tag = BtnTag + i
//设置文字颜色
btn.setTitleColor(self.titleColor, forState: .Normal)
btn.setTitleColor(self.titleSelectedColor, forState: .Selected)
//让默认第0个按钮处于选中状态
if i == 0 {
btn.selected = true
}
//添加点击事件
btn.addTarget(self, action: #selector(YTSegmentControl.btnAction(_:)), forControlEvents: .TouchDown)
//添加到界面上
self.addSubview(btn)
}
//2.创建滑块
self.slider.backgroundColor = self.titleSelectedColor
self.addSubview(self.slider)
}
}
//MARK:444 - 按钮点击事件
extension YTSegmentControl{
func btnAction(btn:UIButton) {
if self.selectedSegmentIndex != btn.tag - BtnTag {
//更新选中的下标
self.selectedSegmentIndex = btn.tag - BtnTag
//通知外部值改变了
if self.target != nil {
//让target去调用action中的方法
//参数1:需要调用的方法对应的Selecter
//参数2:如果Selecter中方法带参,那个这个参数的值就是Selecter中方法的实参
self.target?.performSelector(self.action!, withObject:self)
}
}
}
}
![屏幕快照 2016-08-27 下午3.08.52.png](/Users/macbook/Desktop/屏幕快照 2016-08-27 下午3.08.52.png)
以上就是我本周的总结!