123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795 |
- //
- // CPDFSignatureEditViewController.swift
- // ComPDFKit_Tools
- //
- // Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.
- //
- // THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
- // AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
- // UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
- // This notice may not be removed from this file.
- //
- import UIKit
- import ComPDFKit
- enum CSignatureTopBarSelectedIndex: Int {
- case defaults = 0
- case text
- case image
- }
- let kKMSignayureTextMaxWidth:CGFloat = 200.0
- @objc protocol CPDFSignatureEditViewControllerDelegate: AnyObject {
- @objc optional func signatureEditViewController(_ signatureEditViewController: CPDFSignatureEditViewController, image: UIImage)
- @objc optional func signatureEditViewControllerCancel(_ signatureEditViewController: CPDFSignatureEditViewController)
- }
- class CPDFSignatureEditViewController: UIViewController, UIPopoverPresentationControllerDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIColorPickerViewControllerDelegate, UITextFieldDelegate,UIGestureRecognizerDelegate, CPDFColorSelectViewDelegate, CPDFColorPickerViewDelegate, CSignatureDrawViewDelegate, CPDFFontSettingViewDelegate,CPDFFontStyleTableViewDelegate {
- weak var delegate: CPDFSignatureEditViewControllerDelegate?
- var customType: CSignatureCustomType = .draw
-
- private var colorSelectView: CPDFColorSelectView?
- private var cancelButton: UIButton?
- private var saveButton: UIButton?
- var segmentedControl: UISegmentedControl?
- private var signatureDrawTextView: CSignatureDrawView?
- private var signatureDrawImageView: CSignatureDrawView?
- private var colorPicker: CPDFColorPickerView?
- private var textField: UITextField?
- private var bottomBorder: CALayer?
- private var createButton: UIButton?
- private var selectedIndex: CSignatureTopBarSelectedIndex?
- public var fontSettingView: CPDFFontSettingSubView?
- private var fontStyleTableView: CPDFFontStyleTableView?
- private var thicknessView: UIView?
- private var thicknessLabel: UILabel?
- private var thicknessSlider: UISlider?
- private var clearButton: UIButton?
- private var emptyLabel: UILabel?
- private var headerView: UIView?
- private var isDrawSignature = false
- private var isTextSignature = false
- private var isImageSignature = false
- private var baseName:String = "Helvetica"
- private var baseStyleName:String = ""
- // MARK: - ViewController Methods
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- self.headerView = UIView()
- self.headerView?.layer.borderColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.1).cgColor
- self.headerView?.layer.borderWidth = 1.0
- self.headerView?.backgroundColor = CPDFColorUtils.CAnnotationPropertyViewControllerBackgoundColor()
- if(self.headerView != nil) {
- self.view.addSubview(self.headerView!)
- }
-
- initSegmentedControl()
-
- self.emptyLabel = UILabel()
- self.emptyLabel?.font = UIFont.systemFont(ofSize: 22)
- self.emptyLabel?.textColor = UIColor.gray
- self.emptyLabel?.text = NSLocalizedString("Enter your signature", comment: "")
- self.emptyLabel?.textAlignment = .center
- if(emptyLabel != nil) {
- self.view.addSubview(self.emptyLabel!)
- }
- self.colorSelectView = CPDFColorSelectView()
- colorSelectView?.colorLabel?.removeFromSuperview()
- colorSelectView?.selectedColor = UIColor.black
- colorSelectView?.delegate = self
- if(colorSelectView != nil) {
- self.view.addSubview(colorSelectView!)
- }
- self.thicknessView = UIView()
- self.thicknessView?.backgroundColor = CPDFColorUtils.CAnnotationPropertyViewControllerBackgoundColor()
- if(thicknessView != nil) {
- self.view.addSubview(self.thicknessView!)
- }
- self.thicknessLabel = UILabel()
- self.thicknessLabel?.text = NSLocalizedString("Thickness", comment: "")
- self.thicknessLabel?.textColor = UIColor.gray
- self.thicknessLabel?.font = UIFont.systemFont(ofSize: 12.0)
- if(thicknessLabel != nil) {
- self.thicknessView?.addSubview(self.thicknessLabel!)
- }
- self.thicknessSlider = UISlider()
- self.thicknessSlider?.maximumValue = 20
- self.thicknessSlider?.minimumValue = 1
- self.thicknessSlider?.value = 5
- self.thicknessSlider?.addTarget(self, action: #selector(buttonItemClicked_changes(_:)), for: .valueChanged)
- if(thicknessSlider != nil) {
- self.thicknessView?.addSubview(thicknessSlider!)
- }
-
- self.signatureDrawTextView = CSignatureDrawView(frame: CGRect.zero)
- self.signatureDrawTextView?.delegate = self
- self.signatureDrawTextView?.color = UIColor.black
- self.signatureDrawTextView?.autoresizingMask = .flexibleHeight
- if(thicknessSlider != nil) {
- self.signatureDrawTextView?.lineWidth = CGFloat(self.thicknessSlider!.value)
- }
- if(signatureDrawTextView != nil) {
- self.view.addSubview(self.signatureDrawTextView!)
- }
- self.signatureDrawImageView = CSignatureDrawView()
- self.signatureDrawImageView?.delegate = self
- self.signatureDrawImageView?.color = UIColor.black
- self.signatureDrawImageView?.lineWidth = 4
- self.signatureDrawImageView?.isUserInteractionEnabled = false
- if(signatureDrawImageView != nil) {
- self.view.addSubview(self.signatureDrawImageView!)
- }
- self.signatureDrawImageView?.isHidden = true
- self.cancelButton = UIButton()
- self.cancelButton?.setTitle(NSLocalizedString("Cancel", comment: ""), for: .normal)
- self.cancelButton?.titleLabel?.adjustsFontSizeToFitWidth = true
- self.cancelButton?.setTitleColor(UIColor.black, for: .normal)
- self.cancelButton?.addTarget(self, action: #selector(buttonItemClicked_Cancel(_:)), for: .touchUpInside)
- if(cancelButton != nil) {
- self.headerView?.addSubview(self.cancelButton!)
- }
-
- self.saveButton = UIButton()
- self.saveButton?.setTitle(NSLocalizedString("Save", comment: ""), for: .normal)
- self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
- self.saveButton?.isEnabled = false
- self.saveButton?.addTarget(self, action: #selector(buttonItemClicked_Save(_:)), for: .touchUpInside)
- if(saveButton != nil) {
- self.headerView?.addSubview(self.saveButton!)
- }
- self.bottomBorder = CALayer()
- self.bottomBorder?.backgroundColor = UIColor.black.cgColor
- self.textField = UITextField()
- self.textField?.delegate = self
- self.textField?.textColor = UIColor.black
- self.textField?.placeholder = NSLocalizedString("Enter your signature", comment: "")
- self.textField?.textAlignment = .center
- self.textField?.font = UIFont.systemFont(ofSize: 30)
- self.textField?.addTarget(self, action: #selector(textTextField_change(_:)), for: .editingChanged)
- if(textField != nil) {
- self.view.addSubview(self.textField!)
- }
- if(bottomBorder != nil) {
- self.textField?.layer.addSublayer(self.bottomBorder!)
- }
- self.textField?.isHidden = true
-
- fontSettingView = CPDFFontSettingSubView(frame: CGRect.zero)
- fontSettingView?.fontNameLabel?.font = UIFont.boldSystemFont(ofSize: 13.0)
- fontSettingView?.delegate = self
- fontSettingView?.fontNameLabel?.textColor = UIColor(red: 153/255.0, green: 153/255.0, blue: 153/255.0, alpha: 1)
- fontSettingView?.fontNameLabel?.text = NSLocalizedString("Font", comment: "")
- if(fontSettingView != nil) {
- self.view?.addSubview(fontSettingView!)
- }
- fontSettingView?.isHidden = true
-
- let datasArray:[String] = CPDFFont.fontNames(forFamilyName: baseName)
- baseStyleName = datasArray.first ?? ""
- fontSettingView?.fontNameSelectLabel?.text = baseName
- fontSettingView?.fontStyleNameSelectLabel?.text = baseStyleName
-
- let cFont = CPDFFont(familyName: baseName, fontStyle: baseStyleName )
- var cellFont = UIFont.init(name: CPDFFont.convertAppleFont(cFont) ?? "Helvetica", size: 30.0)
- if cellFont == nil {
- cellFont = UIFont(name: "Helvetica-Oblique", size: 30)
- }
- self.textField?.font = cellFont
-
- self.createButton = UIButton()
- self.createButton?.layer.cornerRadius = 25.0
- self.createButton?.clipsToBounds = true
- self.createButton?.setImage(UIImage(named: "CPDFSignatureImageAdd", in: Bundle(for: self.classForCoder), compatibleWith: nil), for: .normal)
- self.createButton?.backgroundColor = UIColor.blue
- self.createButton?.addTarget(self, action: #selector(buttonItemClicked_create(_:)), for: .touchUpInside)
- if(createButton != nil) {
- self.view.addSubview(self.createButton!)
- }
- self.createButton?.isHidden = true
- self.clearButton = UIButton()
- self.clearButton?.setImage(UIImage(named: "CPDFSignatureImageClean", in: Bundle(for: self.classForCoder), compatibleWith: nil), for: .normal)
- self.clearButton?.titleLabel?.adjustsFontSizeToFitWidth = true
- self.clearButton?.autoresizingMask = [.flexibleLeftMargin, .flexibleBottomMargin]
- self.clearButton?.layer.borderColor = UIColor.gray.cgColor
- self.clearButton?.layer.borderWidth = 1.0
- self.clearButton?.layer.cornerRadius = 25.0
- self.clearButton?.layer.masksToBounds = true
- self.clearButton?.setTitleColor(UIColor.gray, for: .normal)
- self.clearButton?.addTarget(self, action: #selector(buttonItemClicked_clear(_:)), for: .touchUpInside)
- if(clearButton != nil) {
- self.view.addSubview(self.clearButton!)
- }
- self.selectedIndex = .defaults
- self.view.backgroundColor = CPDFColorUtils.CAnnotationPropertyViewControllerBackgoundColor()
- createGestureRecognizer()
- updatePreferredContentSizeWithTraitCollection(traitCollection: traitCollection)
- self.isImageSignature = false
- self.isDrawSignature = false
- self.isImageSignature = false
-
- }
-
- override func viewWillLayoutSubviews() {
- super.viewWillLayoutSubviews()
-
- headerView?.frame = CGRect(x: 0, y: 0, width: view.frame.size.width, height: 50)
- segmentedControl?.frame = CGRect(x: (view.frame.size.width - 220)/2, y: 10, width: 220, height: 30)
- emptyLabel?.frame = CGRect(x: (view.frame.size.width - 200)/2, y: (view.frame.size.height - 50)/2, width: 200, height: 50)
- if #available(iOS 11.0, *) {
- let currentOrientation = UIApplication.shared.statusBarOrientation
- if currentOrientation.isPortrait {
- colorSelectView?.frame = CGRect(x: view.safeAreaInsets.left, y: 50, width: 380, height: 60)
- fontSettingView?.frame = CGRect(x: view.safeAreaInsets.left, y: 140, width: 380, height: 30)
- colorSelectView?.colorPickerView?.frame = CGRect(x: 0, y: 0, width: colorSelectView?.frame.size.width ?? 0, height: colorSelectView?.frame.size.height ?? 0)
- thicknessView?.frame = CGRect(x: view.safeAreaInsets.left, y: 140, width: view.frame.size.width-view.safeAreaInsets.left-view.safeAreaInsets.right, height: 60)
- thicknessLabel?.frame = CGRect(x: 20, y: 15, width: 60, height: 30)
- thicknessSlider?.frame = CGRect(x: 90, y: 0, width: (thicknessView?.bounds.size.width ?? 0)-110, height: 60)
- signatureDrawTextView?.frame = CGRect(x: view.safeAreaInsets.left, y: 210, width: view.frame.size.width - view.safeAreaInsets.left - view.safeAreaInsets.right, height: view.frame.size.height-view.safeAreaInsets.top-view.safeAreaInsets.bottom-150)
- } else if currentOrientation.isLandscape {
- colorSelectView?.frame = CGRect(x: view.safeAreaInsets.left, y: 50, width: 380, height: 60)
- let maxX = colorSelectView?.frame.maxX ?? 0
- fontSettingView?.frame = CGRect(x: maxX + 10, y: (colorSelectView?.frame.midY ?? 0), width: self.view.frame.width - maxX - 10, height: 30)
- thicknessView?.frame = CGRect(x: 380, y: 70, width: view.frame.size.width-380-view.safeAreaInsets.right, height: 60)
- thicknessLabel?.frame = CGRect(x: 20, y: 15, width: 60, height: 30)
- thicknessSlider?.frame = CGRect(x: 90, y: 0, width: (thicknessView?.bounds.size.width ?? 0)-110, height: 60)
- signatureDrawTextView?.frame = CGRect(x: view.safeAreaInsets.left, y: 130, width: view.frame.size.width - view.safeAreaInsets.left - view.safeAreaInsets.right, height: view.frame.size.height-view.safeAreaInsets.top-view.safeAreaInsets.bottom-130)
- }
- saveButton?.frame = CGRect(x: view.frame.size.width - 60 - view.safeAreaInsets.right, y: 5, width: 50, height: 40)
- cancelButton?.frame = CGRect(x: view.safeAreaInsets.left+20, y: 5, width: 50, height: 40)
- signatureDrawImageView?.frame = CGRect(x: view.safeAreaInsets.left, y: 50, width: view.frame.size.width - view.safeAreaInsets.left - view.safeAreaInsets.right, height: view.frame.size.height-view.safeAreaInsets.top-view.safeAreaInsets.bottom-150)
- createButton?.frame = CGRect(x: view.frame.size.width - 70 - view.safeAreaInsets.right, y: view.frame.size.height - 100 - view.safeAreaInsets.bottom, width: 50, height: 50)
- clearButton?.frame = CGRect(x: view.frame.size.width - 70 - view.safeAreaInsets.right, y: view.frame.size.height - 100 - view.safeAreaInsets.bottom, width: 50, height: 50)
- } else {
- let currentOrientation = UIApplication.shared.statusBarOrientation
- if currentOrientation.isPortrait {
- colorSelectView?.frame = CGRect(x: 10, y: 50, width: 380, height: 60)
- fontSettingView?.frame = CGRect(x: 10, y: 140, width: 380, height: 30)
- colorSelectView?.colorPickerView?.frame = CGRect(x: 0, y: 0, width: colorSelectView?.frame.size.width ?? 0, height: colorSelectView?.frame.size.height ?? 0)
- thicknessView?.frame = CGRect(x: 10, y: 140, width: view.frame.size.width-20, height: 60)
- thicknessLabel?.frame = CGRect(x: 20, y: 15, width: 60, height: 30)
- thicknessSlider?.frame = CGRect(x: 90, y: 0, width: (thicknessView?.bounds.size.width ?? 0)-110, height: 60)
- signatureDrawTextView?.frame = CGRect(x: 10, y: 210, width: view.frame.size.width-20, height: view.frame.size.height-114-150)
- } else if currentOrientation.isLandscape {
- colorSelectView?.frame = CGRect(x: 10, y: 50, width: 380, height: 60)
- let maxX = colorSelectView?.frame.maxX ?? 0
- fontSettingView?.frame = CGRect(x: maxX + 10, y: (colorSelectView?.frame.midY ?? 0), width: self.view.frame.width - maxX - 10, height: 30)
- thicknessView?.frame = CGRect(x: 380, y: 70, width: view.frame.size.width-380-10, height: 60)
- thicknessLabel?.frame = CGRect(x: 20, y: 15, width: 60, height: 30)
- thicknessSlider?.frame = CGRect(x: 90, y: 0, width: (thicknessView?.bounds.size.width ?? 0)-110, height: 60)
- signatureDrawTextView?.frame = CGRect(x: 10, y: 130, width: view.frame.size.width-20, height: view.frame.size.height-114-130)
- }
- signatureDrawImageView?.frame = signatureDrawTextView?.frame ?? CGRect.zero
- createButton?.frame = CGRect(x: view.frame.size.width - 70, y: view.frame.size.height - 100, width: 50, height: 50)
- clearButton?.frame = CGRect(x: view.frame.size.width - 70, y: view.frame.size.height - 100, width: 50, height: 50)
- saveButton?.frame = CGRect(x: view.frame.size.width - 60, y: 5, width: 50, height: 40)
- cancelButton?.frame = CGRect(x: 20, y: 5, width: 50, height: 40)
-
- }
- textField?.frame = CGRect(x: (view.frame.size.width - 300)/2, y: 200, width: 300, height: 100)
- }
-
- override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
- if segmentedControl?.selectedSegmentIndex == 1 {
- textField?.resignFirstResponder()
- } else if (segmentedControl?.selectedSegmentIndex == 0) || (segmentedControl?.selectedSegmentIndex == 2) {
- signatureDrawTextView?.signatureClear();
- }
- }
-
- override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
- super.willTransition(to: newCollection, with: coordinator)
- updatePreferredContentSizeWithTraitCollection(traitCollection: newCollection)
- }
-
- // MARK: - Private Methods
-
- func initSegmentedControl() {
- let segmmentArray = [NSLocalizedString("Trackpad", comment: ""), NSLocalizedString("Keyboard", comment: ""), NSLocalizedString("Image", comment: "")]
- segmentedControl = UISegmentedControl(items: segmmentArray)
- segmentedControl?.selectedSegmentIndex = 0
- segmentedControl?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
- segmentedControl?.addTarget(self, action: #selector(segmentedControlValueChanged_singature(_:)), for: .valueChanged)
- if(segmentedControl != nil) {
- self.view.addSubview(segmentedControl!)
- }
- }
-
- func updatePreferredContentSizeWithTraitCollection(traitCollection: UITraitCollection) {
- if self.colorPicker?.superview != nil {
- let currentDevice = UIDevice.current
- if currentDevice.userInterfaceIdiom == .pad {
- // This is an iPad
- self.preferredContentSize = CGSize(width: self.view.bounds.size.width, height: 520)
- } else {
- // This is an iPhone or iPod touch
- self.preferredContentSize = CGSize(width: self.view.bounds.size.width, height: 320)
- }
- } else {
- let width = UIScreen.main.bounds.size.width
- let height = UIScreen.main.bounds.size.height
- let mWidth = min(width, height)
- let mHeight = max(width, height)
- let currentDevice = UIDevice.current
- if currentDevice.userInterfaceIdiom == .pad {
- // This is an iPad
- self.preferredContentSize = CGSize(width: self.view.bounds.size.width, height: traitCollection.verticalSizeClass == .compact ? mWidth * 0.5 : mHeight * 0.6)
- } else {
- // This is an iPhone or iPod touch
- self.preferredContentSize = CGSize(width: self.view.bounds.size.width, height: traitCollection.verticalSizeClass == .compact ? mWidth * 0.9 : mHeight * 0.9)
- }
-
- }
- }
-
- func createGestureRecognizer() {
- self.createButton?.isUserInteractionEnabled = true
- let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panaddBookmarkBtn(_:)))
- self.createButton?.addGestureRecognizer(panRecognizer)
-
- }
-
- @objc func panaddBookmarkBtn(_ gestureRecognizer: UIPanGestureRecognizer) {
- let point = gestureRecognizer.translation(in: self.view)
- let newX = (self.createButton?.center.x ?? 0) + point.x
- let newY = (self.createButton?.center.y ?? 0 ) + point.y
- if self.view.frame.contains(CGPoint(x: newX, y: newY)) {
- self.createButton?.center = CGPoint(x: newX, y: newY)
- }
- gestureRecognizer.setTranslation(.zero, in: self.view)
- }
-
- func image(with view: UIView) -> UIImage? {
- UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0)
- if let ctx = UIGraphicsGetCurrentContext() {
- view.layer.render(in: ctx)
- let image = UIGraphicsGetImageFromCurrentImageContext()
- UIGraphicsEndImageContext()
- return image
- }
- return nil
- }
-
- func labelAutoCalculateRect(with text: String, font: UIFont) -> CGSize {
- let paragraphStyle = NSMutableParagraphStyle()
- let maxSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)
-
- paragraphStyle.lineBreakMode = NSLineBreakMode.byWordWrapping
-
- let attributes: [NSAttributedString.Key: Any] = [
- NSAttributedString.Key.font: font,
- NSAttributedString.Key.paragraphStyle: paragraphStyle
- ]
-
- var labelSize = (text as NSString).boundingRect(with: maxSize, options: [.usesLineFragmentOrigin, .usesFontLeading, .truncatesLastVisibleLine], attributes: attributes, context: nil).size
-
- labelSize.height = ceil(labelSize.height)
- labelSize.width = ceil(labelSize.width)
-
- return labelSize
- }
-
- func initDrawSignatureViewProperties() {
- self.colorSelectView?.isHidden = false
- self.signatureDrawTextView?.isHidden = false
- self.selectedIndex? = .defaults
- self.colorSelectView?.isHidden = false
- self.clearButton?.isHidden = false
- self.signatureDrawTextView?.selectIndex = .text
- self.emptyLabel?.isHidden = false
- self.thicknessView?.isHidden = false
- self.signatureDrawImageView?.isHidden = true
- self.createButton?.isHidden = true
- self.textField?.isHidden = true
- fontSettingView?.isHidden = true
- self.textField?.resignFirstResponder()
- if self.isDrawSignature {
- self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
- self.saveButton?.isEnabled = true
- } else {
- self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
- self.saveButton?.isEnabled = false
- }
-
- }
-
- func initTextSignatureViewProperties() {
- self.colorSelectView?.isHidden = false
- self.signatureDrawTextView?.isHidden = true
- self.signatureDrawImageView?.isHidden = true
- self.textField?.isHidden = false
- fontSettingView?.isHidden = false
- self.selectedIndex = .text
- self.colorSelectView?.isHidden = false
- self.createButton?.isHidden = true
- self.thicknessView?.isHidden = true
- self.clearButton?.isHidden = false
- self.emptyLabel?.isHidden = true
- self.textField?.becomeFirstResponder()
- if self.isTextSignature {
- self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
- self.saveButton?.isEnabled = true
- } else {
- self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
- self.saveButton?.isEnabled = false
- }
-
- }
-
- func initImageSignatureViewProperties() {
- self.textField?.resignFirstResponder()
- self.colorSelectView?.isHidden = true
- self.signatureDrawTextView?.isHidden = true
- self.signatureDrawImageView?.isHidden = false
- self.textField?.isHidden = true
- fontSettingView?.isHidden = true
- self.selectedIndex = .image
- self.createButton?.isHidden = false
- self.colorSelectView?.isHidden = true
- self.signatureDrawImageView?.selectIndex = .image
- self.thicknessView?.isHidden = true
- self.clearButton?.isHidden = true
- self.emptyLabel?.isHidden = true
- self.signatureDrawImageView?.setNeedsDisplay()
- if self.isImageSignature {
- self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
- self.saveButton?.isEnabled = true
- } else {
- self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
- self.saveButton?.isEnabled = false
- }
-
- }
-
- // MARK: - Action
-
- @objc func buttonItemClicked_Save(_ sender: Any) {
- if .defaults == self.selectedIndex {
- let image = self.signatureDrawTextView?.signatureImage()
- if(image != nil) {
- delegate?.signatureEditViewController?(self, image: image ?? UIImage())
- }
- } else if .image == self.selectedIndex {
- self.signatureDrawTextView?.signatureClear()
- let image = self.signatureDrawImageView?.signatureImage()
- if(image != nil) {
- delegate?.signatureEditViewController?(self, image: image ?? UIImage())
- }
- } else if .text == self.selectedIndex {
- let image = createTextSignature()
- if self.textField!.text?.isEmpty ?? true {
- let alertController = UIAlertController(title: "Info", message: "Please input Signature", preferredStyle: .alert)
- let cancelAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
- alertController.addAction(cancelAction)
- self.present(alertController, animated: true, completion: nil)
- return
- }
- if (self.textField?.text) != nil {
- delegate?.signatureEditViewController?(self, image: image )
- }
- }
- }
-
- @objc func buttonItemClicked_Cancel(_ sender: Any) {
- self.dismiss(animated: true, completion: nil)
- }
-
- @objc func buttonItemClicked_create(_ sender: Any) {
- createImageSignature()
- }
-
- @objc func segmentedControlValueChanged_singature(_ sender: Any) {
- if self.segmentedControl?.selectedSegmentIndex == 0 {
- initDrawSignatureViewProperties()
- } else if self.segmentedControl?.selectedSegmentIndex == 1 {
- initTextSignatureViewProperties()
- } else if self.segmentedControl?.selectedSegmentIndex == 2 {
- initImageSignatureViewProperties()
- }
- }
-
- @objc func buttonItemClicked_changes(_ sender: UISlider) {
- self.signatureDrawTextView?.lineWidth = CGFloat(sender.value)
- self.signatureDrawTextView?.setNeedsDisplay()
- }
-
- @objc func buttonItemClicked_clear(_ button: UIButton) {
- if self.segmentedControl?.selectedSegmentIndex == 0 {
- self.signatureDrawTextView?.signatureClear()
- self.emptyLabel?.text = NSLocalizedString("Enter your signature", comment: "")
- self.isDrawSignature = false
- self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
- self.saveButton?.isEnabled = false
- } else if self.segmentedControl?.selectedSegmentIndex == 1 {
- self.textField?.text = ""
- self.isTextSignature = false
- self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
- self.saveButton?.isEnabled = false
- }
- }
-
- @objc func textTextField_change(_ textField: UITextField) {
- if self.textField?.text?.count ?? 0 > 0 {
- self.isTextSignature = true
- self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
- self.saveButton?.isEnabled = true
- } else {
- self.isTextSignature = false
- self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
- self.saveButton?.isEnabled = false
- }
- }
-
- // MARK: - UITextFieldDelegate
-
- func textFieldDidBeginEditing(_ textField: UITextField) {
- if UIApplication.shared.statusBarOrientation.isPortrait {
- UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseIn, animations: {
- self.clearButton?.center = CGPoint(x: self.clearButton?.center.x ?? 0, y: (self.clearButton?.center.y ?? 0)-300)
- }, completion: nil)
- } else {
- UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseIn, animations: {
- self.clearButton?.center = CGPoint(x: self.clearButton?.center.x ?? 0, y: (self.clearButton?.center.y ?? 0)-150)
- self.textField?.center = CGPoint(x: self.textField?.center.x ?? 0, y: (self.textField?.center.y ?? 0)-150)
- }, completion: nil)
- self.colorSelectView?.isHidden = true
- }
- }
-
- func textFieldDidEndEditing(_ textField: UITextField) {
- if UIApplication.shared.statusBarOrientation.isPortrait {
- UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseIn, animations: {
- self.clearButton?.center = CGPoint(x: self.clearButton?.center.x ?? 0, y: (self.clearButton?.center.y ?? 0)+300)
- }, completion: nil)
- } else {
- UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseIn, animations: {
- self.clearButton?.center = CGPoint(x: self.clearButton?.center.x ?? 0, y: (self.clearButton?.center.y ?? 0)+150)
- self.textField?.center = CGPoint(x: self.textField?.center.x ?? 0, y: (self.textField?.center.y ?? 0)+150)
- }, completion: nil)
- self.colorSelectView?.isHidden = false
- }
- }
-
- func textFieldShouldReturn(_ textField: UITextField) -> Bool {
- textField.resignFirstResponder()
- return true
- }
-
- // MARK: - Private Methods
-
- func createImageSignature() {
- let cameraAction = UIAlertAction(title: NSLocalizedString("Camera", comment: ""), style: .default) { (action) in
- let imagePickerController = UIImagePickerController()
- imagePickerController.delegate = self
- imagePickerController.sourceType = .camera
- self.present(imagePickerController, animated: true, completion: nil)
- }
- let photoAction = UIAlertAction(title: NSLocalizedString("Choose from Album", comment: ""), style: .default) { (action) in
- let imagePickerController = UIImagePickerController()
- imagePickerController.delegate = self
- imagePickerController.sourceType = .photoLibrary
- imagePickerController.allowsEditing = true
- imagePickerController.modalPresentationStyle = .popover
- if UI_USER_INTERFACE_IDIOM() == .pad {
- if(self.segmentedControl != nil){
- imagePickerController.popoverPresentationController?.sourceView = self.segmentedControl!
- imagePickerController.popoverPresentationController?.sourceRect = CGRect(x: self.segmentedControl!.bounds.maxX, y: self.segmentedControl!.bounds.maxY, width: 1, height: 1)
- }
- }
- self.present(imagePickerController, animated: true, completion: nil)
- }
-
- let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel, handler: nil)
-
- let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
-
- if UI_USER_INTERFACE_IDIOM() == .pad {
- if (self.segmentedControl != nil) {
- actionSheet.popoverPresentationController?.sourceView = self.segmentedControl!
- actionSheet.popoverPresentationController?.sourceRect = CGRect(x: self.segmentedControl!.bounds.maxX, y: self.segmentedControl!.bounds.maxY, width: 1, height: 1)
- }
- }
-
- actionSheet.addAction(cameraAction)
- actionSheet.addAction(photoAction)
- actionSheet.addAction(cancelAction)
- actionSheet.modalPresentationStyle = .popover
- self.present(actionSheet, animated: true, completion: nil)
-
- }
-
- func createTextSignature() -> UIImage {
- if self.textField?.text?.count ?? 0 < 1 {
- return UIImage()
- }
- let string = self.textField?.text ?? ""
- let font = self.textField?.font
- let size = labelAutoCalculateRect(with: string, font: font ?? UIFont())
- let sideH = size.height + 10
- var w = size.width
- if w + 10 > kKMSignayureTextMaxWidth {
- w = kKMSignayureTextMaxWidth - 10
- }
- let backView = UIView(frame: CGRect(x: 0, y: 0, width: w + 10, height: sideH))
- backView.backgroundColor = UIColor.clear
- let label = UILabel(frame: CGRect(x: 5, y: 5, width: w, height: size.height))
- label.font = font
- label.text = string
- label.textAlignment = .center
- label.numberOfLines = 1
- label.textColor = self.textField?.textColor
- label.adjustsFontSizeToFitWidth = true
- backView.addSubview(label)
- let newImage = image(with: backView) ?? UIImage()
-
- return newImage
- }
-
- // MARK: - UIImagePickerControllerDelegate
-
- func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
- picker.dismiss(animated: true, completion: nil)
- var image: UIImage?
- if let editedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage {
- image = editedImage
- } else if let originalImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
- image = originalImage
- }
- if image != nil {
- self.isImageSignature = true
- self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
- self.saveButton?.isEnabled = true
- }
-
- if let imageOrientation = image?.imageOrientation, imageOrientation != .up {
- UIGraphicsBeginImageContext(image?.size ?? CGSize.zero)
- image?.draw(in: CGRect(x: 0, y: 0, width: image?.size.width ?? 0, height: image?.size.height ?? 0))
- image = UIGraphicsGetImageFromCurrentImageContext()
- UIGraphicsEndImageContext()
- }
-
- if let imageData = image?.pngData(), var image = UIImage(data: imageData) {
- let colorMasking: [CGFloat] = [222, 255, 222, 255, 222, 255]
- let imageRef = image.cgImage?.copy(maskingColorComponents: colorMasking)
- if let imageRef = imageRef {
- image = UIImage(cgImage: imageRef)
- }
-
- self.signatureDrawImageView?.image = image
- self.signatureDrawImageView?.setNeedsDisplay()
- }
-
- }
-
- func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
- picker.dismiss(animated: true)
- }
-
- // MARK: - CPDFColorSelectViewDelegate
-
- func selectColorView(_ select: CPDFColorSelectView, color: UIColor) {
- self.textField?.textColor = color
- self.signatureDrawTextView?.color = color
- self.signatureDrawTextView?.setNeedsDisplay()
-
- }
-
- func selectColorView(_ select: CPDFColorSelectView) {
- if #available(iOS 14.0, *) {
- let picker = UIColorPickerViewController()
- picker.delegate = self
- self.present(picker, animated: true, completion: nil)
- } else {
- let currentDevice = UIDevice.current
- if currentDevice.userInterfaceIdiom == .pad {
- // This is an iPad
- self.colorPicker = CPDFColorPickerView(frame: CGRect(x: self.view.frame.origin.x, y: self.view.frame.origin.y, width: self.view.frame.size.width, height: 520))
- } else {
- // This is an iPhone or iPod touch
- self.colorPicker = CPDFColorPickerView(frame: CGRect(x: self.view.frame.origin.x, y: self.view.frame.origin.y, width: self.view.frame.size.width, height: 320))
- }
- self.colorPicker?.delegate = self
- self.colorPicker?.backgroundColor = CPDFColorUtils.CAnnotationPropertyViewControllerBackgoundColor()
- if(self.colorPicker != nil) {
- self.view.addSubview(self.colorPicker!)
- }
- self.updatePreferredContentSizeWithTraitCollection(traitCollection: traitCollection)
- }
-
- }
-
- // MARK: - CPDFColorPickerViewDelegate
-
- func pickerView(_ colorPickerView: CPDFColorPickerView, color: UIColor) {
- signatureDrawTextView?.color = color
-
- self.textField?.textColor = color
- self.signatureDrawTextView?.color = color
- self.signatureDrawTextView?.setNeedsDisplay()
-
- self.updatePreferredContentSizeWithTraitCollection(traitCollection: traitCollection)
- }
-
- // MARK: - UIColorPickerViewControllerDelegate
-
- @available(iOS 14.0, *)
- func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
- signatureDrawTextView?.color = viewController.selectedColor
-
- self.textField?.textColor = viewController.selectedColor
- self.signatureDrawTextView?.setNeedsDisplay()
- }
-
- // MARK: - CSignatureDrawViewDelegate
-
- func signatureDrawViewStart(_ signatureDrawView: CSignatureDrawView) {
- if self.segmentedControl?.selectedSegmentIndex == 0 {
- self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
- self.saveButton?.isEnabled = true
- self.isDrawSignature = true
- self.emptyLabel?.text = ""
- } else if self.segmentedControl?.selectedSegmentIndex == 2 {
- self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
- self.saveButton?.isEnabled = true
- self.isImageSignature = true
- self.emptyLabel?.text = ""
- }
- }
-
- // MARK: - CPDFFontSettingViewDelegate
- func setCPDFFontSettingViewFontSelect(view: CPDFFontSettingSubView,isFontStyle:Bool) {
- fontStyleTableView = CPDFFontStyleTableView(frame: self.view.bounds, familyNames: view.fontNameSelectLabel?.text ?? "Helvetica", styleName: baseStyleName,isFontStyle: isFontStyle)
- self.fontStyleTableView?.delegate = self
- self.fontStyleTableView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
- self.fontStyleTableView?.backgroundColor = CPDFColorUtils.CAnnotationPropertyViewControllerBackgoundColor()
- if(self.fontStyleTableView != nil) {
- self.view.addSubview(self.fontStyleTableView!)
- }
- self.textField?.endEditing(true)
- }
-
- // MARK: - CPDFFontStyleTableViewDelegate
- func fontStyleTableView(_ fontStyleTableView: CPDFFontStyleTableView, fontName: String, isFontStyle: Bool) {
- var familyName = baseName
- if(isFontStyle) {
- baseStyleName = fontName
- } else {
- baseName = fontName;
- familyName = fontName
-
- let datasArray:[String] = CPDFFont.fontNames(forFamilyName: familyName)
- baseStyleName = datasArray.first ?? ""
- }
-
- self.fontSettingView?.fontNameSelectLabel?.text = familyName
- self.fontSettingView?.fontStyleNameSelectLabel?.text = baseStyleName
-
- let cFont = CPDFFont(familyName: baseName, fontStyle: baseStyleName )
- var cellFont = UIFont.init(name: CPDFFont.convertAppleFont(cFont) ?? "Helvetica", size: 30.0)
- if cellFont == nil {
- cellFont = UIFont(name: "Helvetica-Oblique", size: 30)
- }
- self.textField?.font = cellFont
- }
-
- }
|