swift3.0 簽名的實現
阿新 • • 發佈:2018-12-23
程式碼地址:
效果圖:
效果圖:
核心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() { } }