代码地址:
https://github.com/jinliyuelong/LYJSwiftDemo
效果图:
效果图:
核心view
//
// DrawSignatureView.swift
// MyswiftDemo
//
// Created by Liyanjun on 2017/2/7.
// Copyright © 2017年 hand. All rights reserved.
//
import UIKit
public class DrawSignatureView: UIView {
// 公共属性
public var lineWidth: CGFloat = 2.0 {
didSet {
self.path.lineWidth = lineWidth
}
}
public var strokeColor: UIColor = UIColor.black//画笔颜色
public var signatureBackgroundColor: UIColor = UIColor.white//画板背景色
// 私有属性
// 绘制路径
private var path = UIBezierPath()
// 存储绘制时最新的5个点坐标
private var pts = [CGPoint](repeating: CGPoint(), count: 5)
// 索引,同上面的pts配合。每有5个点的话则绘制一段曲线,依次循环。整个签名图就是由一段段曲线组成的。
private var ctr = 0
// Init
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = self.signatureBackgroundColor
self.path.lineWidth = self.lineWidth
}
// Init
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.backgroundColor = self.signatureBackgroundColor
self.path.lineWidth = self.lineWidth
}
convenience init() {
self.init(frame:CGRect.init(x: 0, y: 0, width: 100, height: 100))
}
// Draw
override public func draw(_ rect: CGRect) {
self.strokeColor.setStroke()//空心
// self.strokeColor.setFill()//实心
self.path.stroke()//连线
}
// 触摸签名相关方法
public override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let firstTouch = touches.first{
let touchPoint = firstTouch.location(in: self)
self.ctr = 0
self.pts[0] = touchPoint
}
}
public override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if let firstTouch = touches.first{
let touchPoint = firstTouch.location(in: self)
self.ctr += 1
self.pts[self.ctr] = touchPoint
if (self.ctr == 4) {
self.pts[3] = CGPoint.init(x: (self.pts[2].x + self.pts[4].x)/2.0, y: (self.pts[2].y + self.pts[4].y)/2.0)
self.path.move(to: self.pts[0])
self.path.addCurve(to: self.pts[3], controlPoint1:self.pts[1],
controlPoint2:self.pts[2])
self.setNeedsDisplay()
self.pts[0] = self.pts[3]
self.pts[1] = self.pts[4]
self.ctr = 1
}
self.setNeedsDisplay()
}
}
public override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if self.ctr == 0{
let touchPoint = self.pts[0]
self.path.move(to: CGPoint(x:touchPoint.x-1.0,y:touchPoint.y))
self.path.addLine(to: CGPoint(x:touchPoint.x+1.0,y:touchPoint.y))
self.setNeedsDisplay()
} else {
self.ctr = 0
}
}
// 签名视图清空
public func clearSignature() {
self.path.removeAllPoints()
self.setNeedsDisplay()
}
// 将签名保存为UIImage
public func getSignature() ->UIImage {
UIGraphicsBeginImageContext(CGSize(width:self.bounds.size.width,
height: self.bounds.size.height))
self.layer.render(in: UIGraphicsGetCurrentContext()!)
let signature: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return signature
}
}
调用Viewcontroller
//
// SignatureViewController.swift
// MyswiftDemo
//
// Created by Liyanjun on 2017/2/7.
// Copyright © 2017年 hand. All rights reserved.
//
import UIKit
class SignatureViewController: UIViewController {
var cancelButton = UIButton.init(title: "取消", bgColor: UIColor.system, font: CGFloat(mylableSize)) //取消按钮
var saveButton = UIButton.init(title: "保存", bgColor: UIColor.system, font: CGFloat(mylableSize)) //取消按钮
var clearButton = UIButton.init(title: "清空", bgColor: UIColor.system, font: CGFloat(mylableSize)) //取消按钮
lazy var drawSignatureView: DrawSignatureView = {
let uiview = DrawSignatureView()
return uiview
}()
lazy var image: UIImage = {
let image = UIImage()
return image
}()
override func viewDidLoad() {
super.viewDidLoad()
self.setupUI()
self.loadData()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//MARK:设置ui
func setupUI() {
self.view.backgroundColor = UIColor.white
self.view.addSubview(saveButton)
self.view.addSubview(clearButton)
self.view.addSubview(cancelButton)
self.adddrawSignatureView()
self.addsaveButton()
self.addclearButton()
self.addcancelButton()
}
//MARK:设置签名view
func adddrawSignatureView() {
self.view.addSubview(drawSignatureView)
self.setdrawSignatureViewF()
self.setSaveButtonP()
}
func setdrawSignatureViewP() {
}
func setdrawSignatureViewF() {
drawSignatureView.snp.makeConstraints { (make) in
make.top.leading.trailing.equalTo(self.view)
make.bottom.equalTo(self.view.snp.bottom).offset(-42)
}
}
//MARK:设置保存按钮
func addsaveButton() {
self.setSaveButtonP()
self.setSaveButtonF()
}
func setSaveButtonP() {
saveButton.layer.masksToBounds = true
saveButton.layer.cornerRadius = 2
saveButton.addTarget(self, action: #selector(savebuttonClick(sender:)), for: .touchUpInside)
}
func setSaveButtonF() {
saveButton.snp.makeConstraints { (make) in
make.leading.bottom.equalTo(self.view)
make.height.equalTo(40)
make.trailing.equalTo(clearButton.snp.leading).offset(-1)
}
}
//MARK:设置清空按钮
func addclearButton() {
self.setclearButtonP()
self.setclearButtonF()
}
func setclearButtonP() {
clearButton.layer.masksToBounds = true
clearButton.layer.cornerRadius = 2
clearButton.addTarget(self, action: #selector(clearButtonclick(sender:)), for: .touchUpInside)
}
func setclearButtonF() {
clearButton.snp.makeConstraints { (make) in
make.width.height.bottom.equalTo(saveButton)
make.leading.equalTo(saveButton.snp.trailing).offset(1)
make.trailing.equalTo(cancelButton.snp.leading).offset(-1)
}
}
//MARK:设置取消按钮
func addcancelButton() {
self.setcancelButtonP()
self.setcancelButtonF()
}
func setcancelButtonP() {
cancelButton.layer.masksToBounds = true
cancelButton.layer.cornerRadius = 2
cancelButton.addTarget(self, action: #selector(cancelButtonClick(sender:)), for: .touchUpInside)
}
func setcancelButtonF() {
cancelButton.snp.makeConstraints { (make) in
make.width.height.bottom.equalTo(saveButton)
make.leading.equalTo(clearButton.snp.trailing).offset(1)
make.trailing.equalTo(self.view.snp.trailing)
}
}
//MARK:保存按钮点击
func savebuttonClick(sender:UIButton) {
let signatureImage = self.drawSignatureView.getSignature()
self.image = signatureImage
}
//MARK:清空按钮
func clearButtonclick(sender:UIButton) {
self.drawSignatureView.clearSignature()
}
//MARK: 取消按钮
func cancelButtonClick(sender:UIButton) {
//清空签名
self.drawSignatureView.clearSignature()
self.navigationController!.popViewController(animated: true)
}
//MARK:获取数据
func loadData() {
}
}