Swift 二维码QRCode

Swift 二维码QRCode
1,直接读取图片中的二维码

1
2
3
4
5
6
7
8
9
10
11
let qrcodeImg =  UIImage(named: "codeBg.png")
let ciImage:CIImage=CIImage(image:qrcodeImg!)!
let context = CIContext(options: nil)
let detector:CIDetector=CIDetector(ofType: CIDetectorTypeQRCode,
context: context, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh])
let features=detector.featuresInImage(ciImage)
print("扫描到二维码个数:\(features.count)")
//遍历所有的二维码,并框出
for feature in features as! [CIQRCodeFeature] {
print(feature.messageString)
}

2,从相册中选择图片读取二维码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//选取相册
//判断设置是否支持图片库
if UIImagePickerController.isSourceTypeAvailable(.PhotoLibrary){
//初始化图片控制器
let picker = UIImagePickerController()
//设置代理
picker.delegate = self
//指定图片控制器类型
picker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
//弹出控制器,显示界面
self.presentViewController(picker, animated: true, completion: {
() -> Void in
})
}else{
print("读取相册错误")
}

//选择图片成功后代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//选择图片成功后代理
func imagePickerController(picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [String : AnyObject]) {
//获取选择的原图
let image = info[UIImagePickerControllerOriginalImage] as! UIImage
//二维码读取
let ciImage:CIImage=CIImage(image:image)!
let context = CIContext(options: nil)
let detector:CIDetector=CIDetector(ofType: CIDetectorTypeQRCode,
context: context, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh])
let features=detector.featuresInImage(ciImage)
print("扫描到二维码个数:\(features.count)")
//遍历所有的二维码,并框出
for feature in features as! [CIQRCodeFeature] {
print(feature.messageString)
}
//图片控制器退出
picker.dismissViewControllerAnimated(true, completion: {
() -> Void in
})
}

3,使用摄像头扫描读取二维码

(1)扫描主要使用的是AVFoundation,用起来方便简单

(2)通过 AVCaptureMetadataOutput 的 rectOfInterest 属性,可以设置探测探测区域。同时给这个探测区域添加个方框,只有在框中的二维码才会被扫描到。

1
2
3
4
5
6
var scanRectView:UIView!
var device:AVCaptureDevice!
var input:AVCaptureDeviceInput!
var output:AVCaptureMetadataOutput!
var session:AVCaptureSession!
var preview:AVCaptureVideoPreviewLayer!

//通过摄像头扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
do{
self.device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
self.input = try AVCaptureDeviceInput(device: device)
self.output = AVCaptureMetadataOutput()
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
self.session = AVCaptureSession()
if UIScreen.mainScreen().bounds.size.height<500 {
self.session.sessionPreset = AVCaptureSessionPreset640x480
}else{
self.session.sessionPreset = AVCaptureSessionPresetHigh
}
self.session.addInput(self.input)
self.session.addOutput(self.output)
self.output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
//计算中间可探测区域
let windowSize:CGSize = UIScreen.mainScreen().bounds.size;
let scanSize:CGSize = CGSizeMake(windowSize.width*3/4,
windowSize.width*3/4);
var scanRect:CGRect = CGRectMake((windowSize.width-scanSize.width)/2,
(windowSize.height-scanSize.height)/2, scanSize.width, scanSize.height);
//计算rectOfInterest 注意x,y交换位置
scanRect = CGRectMake(scanRect.origin.y/windowSize.height,
scanRect.origin.x/windowSize.width,
scanRect.size.height/windowSize.height,
scanRect.size.width/windowSize.width);
//设置可探测区域
self.output.rectOfInterest = scanRect
self.preview = AVCaptureVideoPreviewLayer(session:self.session)
self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill
self.preview.frame = UIScreen.mainScreen().bounds
self.view.layer.insertSublayer(self.preview, atIndex:0)
//添加中间的探测区域绿框
self.scanRectView = UIView();
self.view.addSubview(self.scanRectView)
self.scanRectView.frame = CGRectMake(0, 0, scanSize.width, scanSize.height);
self.scanRectView.center = CGPointMake(
CGRectGetMidX(UIScreen.mainScreen().bounds),
CGRectGetMidY(UIScreen.mainScreen().bounds));
self.scanRectView.layer.borderColor = UIColor.greenColor().CGColor
self.scanRectView.layer.borderWidth = 1;
//开始捕获
self.session.startRunning()
}catch _ as NSError{
//打印错误消息
let errorAlert = UIAlertView(title: "提醒",
message: "请在iPhone的\"设置-隐私-相机\"选项中,允许本程序访问您的相机",
delegate: self,
cancelButtonTitle: "确定")
errorAlert.show()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//摄像头捕获
func captureOutput(captureOutput: AVCaptureOutput!,
didOutputMetadataObjects metadataObjects: [AnyObject]!,
fromConnection connection: AVCaptureConnection!) {
var stringValue:String?
if metadataObjects.count > 0 {
let metadataObject = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
stringValue = metadataObject.stringValue
if stringValue != nil{
self.session.stopRunning()
}
}
self.session.stopRunning()
//输出结果
let alertView = UIAlertView(title: "二维码", message: stringValue,
delegate: self, cancelButtonTitle: "确定")
alertView.show()
}

//消息框确认后消失

1
2
3
4
5
    //消息框确认后消失
    func alertView(alertView: UIAlertView, willDismissWithButtonIndex buttonIndex: Int) {
         //继续扫描
         self.session.startRunning()
    }

Swift使用AVFoundation实现条形码扫描

Swift - 使用AVFoundation实现条形码扫描(附:拉近镜头改善读取)

1,条形码(一维码)的扫描读取

metadataObjectTypes 做如下修改

1
2
3
self.output.metadataObjectTypes = [AVMetadataObjectTypeEAN13Code,
AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code,
AVMetadataObjectTypeCode39Code,AVMetadataObjectTypeCode93Code]

2,拉近镜头,改善条形码读取效果

如果条码太小的时候,就会识别不出来。

解决办法是:通过代码拉近镜头焦距,放大内容区域让机器更好的识别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import UIKit
import AVFoundation

class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate,
UIAlertViewDelegate{

var scanRectView:UIView!
var device:AVCaptureDevice!
var input:AVCaptureDeviceInput!
var output:AVCaptureMetadataOutput!
var session:AVCaptureSession!
var preview:AVCaptureVideoPreviewLayer!

override func viewDidLoad() {
super.viewDidLoad()

fromCamera()
}

//通过摄像头扫描
func fromCamera() {
do{
self.device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

self.input = try AVCaptureDeviceInput(device: device)

self.output = AVCaptureMetadataOutput()
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())

self.session = AVCaptureSession()
if UIScreen.mainScreen().bounds.size.height<500 {
self.session.sessionPreset = AVCaptureSessionPreset640x480
}else{
self.session.sessionPreset = AVCaptureSessionPresetHigh
}

self.session.addInput(self.input)
self.session.addOutput(self.output)

self.output.metadataObjectTypes = [AVMetadataObjectTypeEAN13Code,
AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code,
AVMetadataObjectTypeCode39Code,AVMetadataObjectTypeCode93Code]

//计算中间可探测区域
let windowSize:CGSize = UIScreen.mainScreen().bounds.size;
let scanSize:CGSize = CGSizeMake(windowSize.width*3/4,
windowSize.width*3/4);
var scanRect:CGRect = CGRectMake((windowSize.width-scanSize.width)/2,
(windowSize.height-scanSize.height)/2, scanSize.width, scanSize.height);
//计算rectOfInterest 注意x,y交换位置
scanRect = CGRectMake(scanRect.origin.y/windowSize.height,
scanRect.origin.x/windowSize.width,
scanRect.size.height/windowSize.height,
scanRect.size.width/windowSize.width);
//设置可探测区域
self.output.rectOfInterest = scanRect

self.preview = AVCaptureVideoPreviewLayer(session:self.session)
self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill
self.preview.frame = UIScreen.mainScreen().bounds
self.view.layer.insertSublayer(self.preview, atIndex:0)

//添加中间的探测区域绿框
self.scanRectView = UIView();
self.view.addSubview(self.scanRectView)
self.scanRectView.frame = CGRectMake(0, 0, scanSize.width, scanSize.height);
self.scanRectView.center = CGPointMake(
CGRectGetMidX(UIScreen.mainScreen().bounds),
CGRectGetMidY(UIScreen.mainScreen().bounds));
self.scanRectView.layer.borderColor = UIColor.greenColor().CGColor
self.scanRectView.layer.borderWidth = 1;

//开始捕获
self.session.startRunning()

//放大
do {
try self.device!.lockForConfiguration()
} catch _ {
NSLog("Error: lockForConfiguration.");
}
self.device!.videoZoomFactor = 1.5
self.device!.unlockForConfiguration()
//放大


}catch _ as NSError{
//打印错误消息
let errorAlert = UIAlertView(title: "提醒",
message: "请在iPhone的\"设置-隐私-相机\"选项中,允许本程序访问您的相机",
delegate: self,
cancelButtonTitle: "确定")
errorAlert.show()
}
}

//摄像头捕获
func captureOutput(captureOutput: AVCaptureOutput!,
didOutputMetadataObjects metadataObjects: [AnyObject]!,
fromConnection connection: AVCaptureConnection!) {

var stringValue:String?
if metadataObjects.count > 0 {
let metadataObject = metadataObjects[0]
as! AVMetadataMachineReadableCodeObject
stringValue = metadataObject.stringValue

if stringValue != nil{
self.session.stopRunning()
}
}
self.session.stopRunning()
//输出结果
let alertView = UIAlertView(title: "一维码", message: stringValue,
delegate: self, cancelButtonTitle: "确定")
alertView.show()
}

//消息框确认后消失
func alertView(alertView: UIAlertView, willDismissWithButtonIndex buttonIndex: Int) {
//继续扫描
self.session.startRunning()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}

ios存储方式做之一UserDefaults

ios存储方式做之一UserDefaults

1、UserDefaults支持的数据格式有:Number、Data、Date、String、Array、Dictionary、BOOL

2、以键值对的形式进行存储

3、存储时间为整体应用程序的存储时间,如果想需要删除,需要删除整体应用程序

使用方法
1,初始化一个userDefaults

let userDefaults = UserDefaults.standard

UserDefaults.standard.set(true, forKey: “isFrist”)

2,把数据存到磁盘上
userDefaults.synchronize()

3,删除
userDefaults.removeObject(forKey: <#T##String#>)

4,打印app资源目录路径
let path = Bundle.main.bundlePath

ios核心动画之CAShapeLayer

专用图层

CAShapeLayer

CAShapeLayer优点:

  1. 渲染快速。CAShapeLayer使用了硬件加速,绘制同一图形会比用Core Graphics快很多。
  2. 高效使用内存。一个CAShapeLayer不需要像普通CALayer一样创建一个寄宿图形,所以无论有多大,都不会占用太多的内存。
  3. 不会被图层边界剪裁掉。一个CAShapeLayer可以在边界之外绘制。你的图层路径不会像在使用Core Graphics的普通CALayer一样被剪裁掉(如我们在第二章所见)。
  4. 不会出现像素化。当你给CAShapeLayer做3D变换时,它不像一个有寄宿图的普通图层一样变得像素化。

创建一个CGPath 一般使用 UIBezierPath 绘制路线。

CAShapeLayer 属性

  • lineWith(线宽,用点表示单位)
  • lineCap(线条结尾的样子)
  • lineJoin(线条之间的结合点的样子)
  • strokeColor(线条颜色)
  • fillColor(填充颜色)
  • path(路线)

标签栏按钮UITabBarItem样式修改

Swift - 标签栏按钮UITabBarItem样式修改

1,tabBarItem图片的推荐尺寸和最大支持尺寸
下面是标签栏(UITabBar)中tab按钮图标分别在1x、2x、3x下不会压缩变形的尺寸:

1
2
3
@1x : 推荐 25 x 25   (最大: 48 x 32)
@2x : 推荐 50 x 50 (最大: 96 x 64)
@3x : 推荐 75 x 75 (最大: 144 x 96)

2,修改图片和文字的颜色
(1)图片和文字同时改变

1
2
//图片文字一起变色
self.tabBar.tintColor = UIColor.orange()

(2)只改变文字颜色

1
2
3
4
5
//改变文字颜色
UITabBarItem.appearance().setTitleTextAttributes(
[NSForegroundColorAttributeName: UIColor.gray], forState:.normal)
UITabBarItem.appearance().setTitleTextAttributes(
[NSForegroundColorAttributeName: UIColor.orange], forState:.selected)

(3)只改变图片颜色

1
2
3
4
self.tabBar.tintColor = UIColor.orange()
//文字颜色还原
UITabBarItem.appearance().setTitleTextAttributes(
[NSForegroundColorAttributeName: self.view.tintColor], forState:.selected)

3,选中时、不选中时使用不同图片
默认标签选中、不选中都使用的是同一个图片,只是颜色不同。我们也可使用两张不同图片表示两种状态。

1
2
3
4
5
qq.tabBarItem = UITabBarItem(title: "QQ", image: UIImage(named: "qq"),
selectedImage: UIImage(named: "qq_active"))

android.tabBarItem = UITabBarItem(title: "Android", image: UIImage(named: "android"),
selectedImage: UIImage(named: "android_active"))

4,使用图片的原始颜色
默认不管原图是什么颜色,渲染器都会将渲染成单一颜色,虽说符合现在扁平化的趋势,但有时我们还是想要使用图片原来的样子。

1
2
3
4
5
qq.tabBarItem =  UITabBarItem(title: "QQ", image: UIImage(named: "qq_color"),
selectedImage: UIImage(named: "qq_color")?.imageWithRenderingMode(.AlwaysOriginal))

android.tabBarItem = UITabBarItem(title: "Android", image: UIImage(named: "android_color"),
selectedImage: UIImage(named: "android_color")?.imageWithRenderingMode(.AlwaysOriginal))

swift-SnapKit自动布局使用1

swift自动布局库SnapKit使用详解1
SnapKit 前身是Masonry(一个oc版本的布局库)

1 安装

SnapKit github地址 https://github.com/SnapKit/SnapKit

可以通过Cocoapods 安装
在Podfile中加入

1
2
3
4
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
pod 'SnapKit'

然后在终端项目目录下输入

1
pod install

2 SnapKit的使用方法
snp_makeConstraints 来添加view的约束

  • 边距,宽,高,左上右下,基准线。
  • 修正位移(inset,offset)
  • 倍率修正(multipliedBy)

注意: 使用 snp_makeConstraints 方法的元素必须事先添加到父元素的中,例如:self.view.addSubview(view)

  • .equalTo: 等于
  • .lessThanOrEqualTo: 小于等于
  • .greaterThanOrEqualTo: 大于等于

3 约束条件参数支持如下三种类型:

(1)视图属性(ViewAttribute)

1
2
//使当前视图对象的中心x坐标小于等于视图view2的左边的x坐标
make.centerX.lessThanOrEqualTo(view2.snp_left)

(2)视图关系(UIView/NSView)

1
2
3
4
5
6
比如想让view.left 大于等于 label.left:

make.left.greaterThanOrEqualTo(label)
这个其实等价于:

make.left.greaterThanOrEqualTo(label.snp_left)

(3)严格检测(Strick Checks)

1
2
3
4
比如将宽度和高度属性设置为常量值:
make.height.equalTo(20)
make.width.equalTo(20)
make.top.equalTo(42)

4 给视图的各种属性设置约束

(1)width、height属性

1
2
3
4
5
6
自动布局允许宽度、高度设置为常量值。

make.height.equalTo(20)
make.width.equalTo(self.buttonSize.width)
//当前视图与label的顶部齐平
make.top.equalTo(label.snp_top)

(2) left、right、top、centerX、centerY等其他属性

1
2
3
这些属性直接设置常量值,表示他们相对于父容器的相对约束条件。

当然也可以使用与其他视图的关系来添加约束。

(3)edges(边缘)

1
2
//让当前视图 的 上下左右(top,left,bottom,right) 等于 view2
make.edges.equalTo(view2)

(4)size(尺寸)

1
2
//当前视图宽高 >= titleLabel
make.size.greaterThanOrEqualTo(titleLabel)

(5)center(中心)

1
2
//当前视图与 button1中心相同 (centerX 和 centerY)
make.center.equalTo(button1)

5 位移修正与倍率修正

(1)内位移修正:inset

1
2
3
4
5
6
7
8
9
视图view,它距离父视图上、左、下、右边距分别是10、15、20、25

make.edges.equalTo(boxOutter).inset(UIEdgeInsetsMake(10, 15, 20, 25))
上面边距的偏移设置实际上相当于如下形式:

make.top.equalTo(boxOutter).offset(10)
make.left.equalTo(boxOutter).offset(15)
make.bottom.equalTo(boxOutter).offset(-20)
make.right.equalTo(boxOutter).offset(-25)

(2)外位移修正:offset

1
2
视图比视图宽度加50,高度减50。
make.size.equalTo(boxOutter).offset(CGSizeMake(50, -50))

(3)倍率修正:multipliedBy

1
2
视图的尺寸设置成视图一半大小。
make.size.equalTo(boxOutter).multipliedBy(0.5)

swift-SnapKit自动布局使用2

1 保存约束

1
2
3
4
//保存约束的引用
var topConstraint:Constraint?

self.topConstraint = make.top.equalTo(self.view).offset(40).constraint

2 删除约束

1
2
//移除约束
self.topConstraint?.uninstall()

3 通过约束的引用来更新约束 updateOffset()

1
2
//更新修改约束
self.topConstraint?.updateOffset(60)

4 使用snp_updateConstraints更新约束

我们还可以用 snp_updateConstraints 方法来代替 snp_makeConstraints 进行约束的更新,这个更新操作通常放在 UIViewController 的 updateViewConstraints() 方法中,或者 UIView 的 updateConstraints() 方法中执行,这样视图约束需要更新的时候会自动调用。

1
2
3
4
5
6
7
8
9
10
//视图约束更新
override func updateViewConstraints() {
self.box.snp_updateConstraints{ (make) -> Void in
//视图宽度与屏幕等宽
make.width.equalTo(self.view)
}

super.updateViewConstraints()
}
}

5 使用snp_remakeConstraints重做约束

1
2
3
4
5
6
snp_remakeConstraints 与 snp_makeConstraints 用法类似,不同的是 snp_remakeConstraints 首先会先清除掉之前所有被SnapKit设置的约束。

//重做约束
box.snp_remakeConstraints { (make) -> Void in
make.width.height.equalTo(100)
}

swift-SnapKit自动布局使用3

1,约束优先级

我们使用SnapKit的时候,还可以定义约束的优先级。

这样当约束出现冲突的时候,优先级高的约束覆盖优先级低的约束。

具体优先级可以放在约束链的结束处。

可以设置如下几种优先级

1
2
3
4
priorityLow():设置低优先级,优先级为250
priorityMedium():设置中优先级,优先级为500(这个也就是默认的优先级)
priorityHigh():设置高优先级,优先级为750
priority():可以设置任意的优先级,接受的参数是0-1000的数字。比如:priority(600)

举例

1
2
3
4
5
//初始宽、高为100(优先级低)
make.width.height.equalTo(100 * self.scacle).priorityLow();
//最大尺寸不能超过屏幕
make.width.height.lessThanOrEqualTo(self.view.snp_width)
make.width.height.lessThanOrEqualTo(self.view.snp_height)

2,带有动画效果

配合 UIView.animateWithDuration,我们可以在约束改变的时候有动画效果。

1
2
3
4
 //动画
 UIView.animateWithDuration(0.3) {
       self.view.layoutIfNeeded()
 }

Swift使用CIFilter生成二维码图片(QRCode)

Swift - 使用CIFilter生成二维码图片(QRCode)

CIFilter提供了各种各样的滤镜,其中CIQRCodeGenerator可以用来生成二维码。下面通过一个样例演示如何将字符串(链接也是字符串)生成二维码图片,同时支持在二维码中间放置个性化图标。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

//不带图片的二维码图片
let imageViewIcon1 = UIImageView(frame: CGRectMake(20, 20, 150, 150))
imageViewIcon1.image = createQRForString("http://www.hangge.com",
qrImageName: "")
self.view.addSubview(imageViewIcon1)

//带图片的二维码图片
let imageViewIcon2 = UIImageView(frame: CGRectMake(200, 20, 150, 150))
imageViewIcon2.image = createQRForString("http://www.hangge.com",
qrImageName: "logo")
self.view.addSubview(imageViewIcon2)
}

//创建二维码图片
func createQRForString(qrString: String?, qrImageName: String?) -> UIImage?{
if let sureQRString = qrString {
let stringData = sureQRString.dataUsingEncoding(NSUTF8StringEncoding,
allowLossyConversion: false)
// 创建一个二维码的滤镜
let qrFilter = CIFilter(name: "CIQRCodeGenerator")!
qrFilter.setValue(stringData, forKey: "inputMessage")
qrFilter.setValue("H", forKey: "inputCorrectionLevel")
let qrCIImage = qrFilter.outputImage
// 创建一个颜色滤镜,黑白色
let colorFilter = CIFilter(name: "CIFalseColor")!
colorFilter.setDefaults()
colorFilter.setValue(qrCIImage, forKey: "inputImage")
colorFilter.setValue(CIColor(red: 0, green: 0, blue: 0), forKey: "inputColor0")
colorFilter.setValue(CIColor(red: 1, green: 1, blue: 1), forKey: "inputColor1")
// 返回二维码image
let codeImage = UIImage(CIImage: colorFilter.outputImage!
.imageByApplyingTransform(CGAffineTransformMakeScale(5, 5)))
// 通常,二维码都是定制的,中间都会放想要表达意思的图片
if let iconImage = UIImage(named: qrImageName!) {
let rect = CGRectMake(0, 0, codeImage.size.width, codeImage.size.height)
UIGraphicsBeginImageContext(rect.size)

codeImage.drawInRect(rect)
let avatarSize = CGSizeMake(rect.size.width * 0.25, rect.size.height * 0.25)
let x = (rect.width - avatarSize.width) * 0.5
let y = (rect.height - avatarSize.height) * 0.5
iconImage.drawInRect(CGRectMake(x, y, avatarSize.width, avatarSize.height))
let resultImage = UIGraphicsGetImageFromCurrentImageContext()

UIGraphicsEndImageContext()
return resultImage
}
return codeImage
}
return nil
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}

按钮(UIButton)的用法

按钮(UIButton)的用法

1,按钮的创建

(1)按钮有下面四种类型:

1
2
3
4
5
6
UIButtonType.ContactAdd:前面带“+”图标按钮,默认文字颜色为蓝色,有触摸时的高亮效果
UIButtonType.DetailDisclosure:前面带“!”图标按钮,默认文字颜色为蓝色,有触摸时的高亮效果
UIButtonType.System:前面不带图标,默认文字颜色为蓝色,有触摸时的高亮效果
UIButtonType.Custom:定制按钮,前面不带图标,默认文字颜色为白色,无触摸时的高亮效果
UIButtonType.InfoDark:为感叹号“!”圆形按钮
UIButtonType.InfoLight:为感叹号“!”圆形按钮
1
2
3
4
5
6
7
//创建一个ContactAdd类型的按钮
let button:UIButton = UIButton(type:.ContactAdd)
//设置按钮位置和大小
button.frame=CGRectMake(10, 150, 100, 30)
//设置按钮文字
button.setTitle("按钮", forState:UIControlState.Normal)
self.view.addSubview(button);

(2)对于Custom定制类型按钮,代码可简化为:

1
let button = UIButton(frame:CGRectMake(10, 150, 100, 30))

2,按钮的文字设置

1
2
3
button.setTitle("普通状态", forState:UIControlState.Normal) //普通状态下的文字
button.setTitle("触摸状态", forState:UIControlState.Highlighted) //触摸状态下的文字
button.setTitle("禁用状态", forState:UIControlState.Disabled) //禁用状态下的文字

3,按钮文字颜色的设置

1
2
3
button.setTitleColor(UIColor.blackColor(),forState: .Normal) //普通状态下文字的颜色
button.setTitleColor(UIColor.greenColor(),forState: .Highlighted) //触摸状态下文字的颜色
button.setTitleColor(UIColor.grayColor(),forState: .Disabled) //禁用状态下文字的颜色

4,按钮文字阴影颜色的设置

1
2
3
button.setTitleShadowColor(UIColor.greenColor(),forState:.Normal) //普通状态下文字阴影的颜色
button.setTitleShadowColor(UIColor.yellowColor(),forState:.Highlighted) //普通状态下文字阴影的颜色
button.setTitleShadowColor(UIColor.grayColor(),forState:.Disabled) //普通状态下文字阴影的颜色

5,按钮背景颜色设置

1
button.backgroundColor=UIColor.blackColor()

6,按钮文字图标的设置

1
2
3
button.setImage(UIImage(named:"icon1"),forState:.Normal)  //设置图标
button.adjustsImageWhenHighlighted=false //使触摸模式下按钮也不会变暗
button.adjustsImageWhenDisabled=false //使禁用模式下按钮也不会变暗

7,设置按钮背景图片

1
button.setBackgroundImage(UIImage(named:"background1"),forState:.Normal)

8,按钮触摸点击事件响应

1
2
3
4
5
6
7
8
9
10
11
//不传递触摸对象(即点击的按钮)
button.addTarget(self,action:#selector(tapped),forControlEvents:.TouchUpInside)
func tapped(){
print("tapped")
}

//传递触摸对象(即点击的按钮),需要在定义action参数时,方法名称后面带上冒号
button.addTarget(self,action:#selector(tapped(_:)),forControlEvents:.TouchUpInside)
func tapped(button:UIButton){
print(button.titleForState(.Normal))
}

常用的触摸事件类型:

1
2
3
4
5
6
7
8
9
TouchDown:单点触摸按下事件,点触屏幕
TouchDownRepeat:多点触摸按下事件,点触计数大于1,按下第2、3或第4根手指的时候
TouchDragInside:触摸在控件内拖动时
TouchDragOutside:触摸在控件外拖动时
TouchDragEnter:触摸从控件之外拖动到内部时
TouchDragExit:触摸从控件内部拖动到外部时
TouchUpInside:在控件之内触摸并抬起事件
TouchUpOutside:在控件之外触摸抬起事件
TouchCancel:触摸取消事件,即一次触摸因为放上太多手指而被取消,或者电话打断