1. 程式人生 > >swift3.0 簽名的實現

swift3.0 簽名的實現

程式碼地址:

效果圖:

效果圖:

核心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()  {
        
    }
    
    
    

}