CPDFSignatureEditViewController.swift 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. //
  2. // CPDFSignatureEditViewController.swift
  3. // ComPDFKit_Tools
  4. //
  5. // Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.
  6. //
  7. // THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
  8. // AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
  9. // UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
  10. // This notice may not be removed from this file.
  11. //
  12. import UIKit
  13. import ComPDFKit
  14. enum CSignatureTopBarSelectedIndex: Int {
  15. case defaults = 0
  16. case text
  17. case image
  18. }
  19. let kKMSignayureTextMaxWidth:CGFloat = 200.0
  20. @objc protocol CPDFSignatureEditViewControllerDelegate: AnyObject {
  21. @objc optional func signatureEditViewController(_ signatureEditViewController: CPDFSignatureEditViewController, image: UIImage)
  22. @objc optional func signatureEditViewControllerCancel(_ signatureEditViewController: CPDFSignatureEditViewController)
  23. }
  24. class CPDFSignatureEditViewController: UIViewController, UIPopoverPresentationControllerDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIColorPickerViewControllerDelegate, UITextFieldDelegate,UIGestureRecognizerDelegate, CPDFColorSelectViewDelegate, CPDFColorPickerViewDelegate, CSignatureDrawViewDelegate, CPDFFontSettingViewDelegate,CPDFFontStyleTableViewDelegate {
  25. weak var delegate: CPDFSignatureEditViewControllerDelegate?
  26. var customType: CSignatureCustomType = .draw
  27. private var colorSelectView: CPDFColorSelectView?
  28. private var cancelButton: UIButton?
  29. private var saveButton: UIButton?
  30. var segmentedControl: UISegmentedControl?
  31. private var signatureDrawTextView: CSignatureDrawView?
  32. private var signatureDrawImageView: CSignatureDrawView?
  33. private var colorPicker: CPDFColorPickerView?
  34. private var textField: UITextField?
  35. private var bottomBorder: CALayer?
  36. private var createButton: UIButton?
  37. private var selectedIndex: CSignatureTopBarSelectedIndex?
  38. public var fontSettingView: CPDFFontSettingSubView?
  39. private var fontStyleTableView: CPDFFontStyleTableView?
  40. private var thicknessView: UIView?
  41. private var thicknessLabel: UILabel?
  42. private var thicknessSlider: UISlider?
  43. private var clearButton: UIButton?
  44. private var emptyLabel: UILabel?
  45. private var headerView: UIView?
  46. private var isDrawSignature = false
  47. private var isTextSignature = false
  48. private var isImageSignature = false
  49. private var baseName:String = "Helvetica"
  50. private var baseStyleName:String = ""
  51. // MARK: - ViewController Methods
  52. override func viewDidLoad() {
  53. super.viewDidLoad()
  54. self.headerView = UIView()
  55. self.headerView?.layer.borderColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.1).cgColor
  56. self.headerView?.layer.borderWidth = 1.0
  57. self.headerView?.backgroundColor = CPDFColorUtils.CAnnotationPropertyViewControllerBackgoundColor()
  58. if(self.headerView != nil) {
  59. self.view.addSubview(self.headerView!)
  60. }
  61. initSegmentedControl()
  62. self.emptyLabel = UILabel()
  63. self.emptyLabel?.font = UIFont.systemFont(ofSize: 22)
  64. self.emptyLabel?.textColor = UIColor.gray
  65. self.emptyLabel?.text = NSLocalizedString("Enter your signature", comment: "")
  66. self.emptyLabel?.textAlignment = .center
  67. if(emptyLabel != nil) {
  68. self.view.addSubview(self.emptyLabel!)
  69. }
  70. self.colorSelectView = CPDFColorSelectView()
  71. colorSelectView?.colorLabel?.removeFromSuperview()
  72. colorSelectView?.selectedColor = UIColor.black
  73. colorSelectView?.delegate = self
  74. if(colorSelectView != nil) {
  75. self.view.addSubview(colorSelectView!)
  76. }
  77. self.thicknessView = UIView()
  78. self.thicknessView?.backgroundColor = CPDFColorUtils.CAnnotationPropertyViewControllerBackgoundColor()
  79. if(thicknessView != nil) {
  80. self.view.addSubview(self.thicknessView!)
  81. }
  82. self.thicknessLabel = UILabel()
  83. self.thicknessLabel?.text = NSLocalizedString("Thickness", comment: "")
  84. self.thicknessLabel?.textColor = UIColor.gray
  85. self.thicknessLabel?.font = UIFont.systemFont(ofSize: 12.0)
  86. if(thicknessLabel != nil) {
  87. self.thicknessView?.addSubview(self.thicknessLabel!)
  88. }
  89. self.thicknessSlider = UISlider()
  90. self.thicknessSlider?.maximumValue = 20
  91. self.thicknessSlider?.minimumValue = 1
  92. self.thicknessSlider?.value = 5
  93. self.thicknessSlider?.addTarget(self, action: #selector(buttonItemClicked_changes(_:)), for: .valueChanged)
  94. if(thicknessSlider != nil) {
  95. self.thicknessView?.addSubview(thicknessSlider!)
  96. }
  97. self.signatureDrawTextView = CSignatureDrawView(frame: CGRect.zero)
  98. self.signatureDrawTextView?.delegate = self
  99. self.signatureDrawTextView?.color = UIColor.black
  100. self.signatureDrawTextView?.autoresizingMask = .flexibleHeight
  101. if(thicknessSlider != nil) {
  102. self.signatureDrawTextView?.lineWidth = CGFloat(self.thicknessSlider!.value)
  103. }
  104. if(signatureDrawTextView != nil) {
  105. self.view.addSubview(self.signatureDrawTextView!)
  106. }
  107. self.signatureDrawImageView = CSignatureDrawView()
  108. self.signatureDrawImageView?.delegate = self
  109. self.signatureDrawImageView?.color = UIColor.black
  110. self.signatureDrawImageView?.lineWidth = 4
  111. self.signatureDrawImageView?.isUserInteractionEnabled = false
  112. if(signatureDrawImageView != nil) {
  113. self.view.addSubview(self.signatureDrawImageView!)
  114. }
  115. self.signatureDrawImageView?.isHidden = true
  116. self.cancelButton = UIButton()
  117. self.cancelButton?.setTitle(NSLocalizedString("Cancel", comment: ""), for: .normal)
  118. self.cancelButton?.titleLabel?.adjustsFontSizeToFitWidth = true
  119. self.cancelButton?.setTitleColor(UIColor.black, for: .normal)
  120. self.cancelButton?.addTarget(self, action: #selector(buttonItemClicked_Cancel(_:)), for: .touchUpInside)
  121. if(cancelButton != nil) {
  122. self.headerView?.addSubview(self.cancelButton!)
  123. }
  124. self.saveButton = UIButton()
  125. self.saveButton?.setTitle(NSLocalizedString("Save", comment: ""), for: .normal)
  126. self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
  127. self.saveButton?.isEnabled = false
  128. self.saveButton?.addTarget(self, action: #selector(buttonItemClicked_Save(_:)), for: .touchUpInside)
  129. if(saveButton != nil) {
  130. self.headerView?.addSubview(self.saveButton!)
  131. }
  132. self.bottomBorder = CALayer()
  133. self.bottomBorder?.backgroundColor = UIColor.black.cgColor
  134. self.textField = UITextField()
  135. self.textField?.delegate = self
  136. self.textField?.textColor = UIColor.black
  137. self.textField?.placeholder = NSLocalizedString("Enter your signature", comment: "")
  138. self.textField?.textAlignment = .center
  139. self.textField?.font = UIFont.systemFont(ofSize: 30)
  140. self.textField?.addTarget(self, action: #selector(textTextField_change(_:)), for: .editingChanged)
  141. if(textField != nil) {
  142. self.view.addSubview(self.textField!)
  143. }
  144. if(bottomBorder != nil) {
  145. self.textField?.layer.addSublayer(self.bottomBorder!)
  146. }
  147. self.textField?.isHidden = true
  148. fontSettingView = CPDFFontSettingSubView(frame: CGRect.zero)
  149. fontSettingView?.fontNameLabel?.font = UIFont.boldSystemFont(ofSize: 13.0)
  150. fontSettingView?.delegate = self
  151. fontSettingView?.fontNameLabel?.textColor = UIColor(red: 153/255.0, green: 153/255.0, blue: 153/255.0, alpha: 1)
  152. fontSettingView?.fontNameLabel?.text = NSLocalizedString("Font", comment: "")
  153. if(fontSettingView != nil) {
  154. self.view?.addSubview(fontSettingView!)
  155. }
  156. fontSettingView?.isHidden = true
  157. let datasArray:[String] = CPDFFont.fontNames(forFamilyName: baseName)
  158. baseStyleName = datasArray.first ?? ""
  159. fontSettingView?.fontNameSelectLabel?.text = baseName
  160. fontSettingView?.fontStyleNameSelectLabel?.text = baseStyleName
  161. let cFont = CPDFFont(familyName: baseName, fontStyle: baseStyleName )
  162. var cellFont = UIFont.init(name: CPDFFont.convertAppleFont(cFont) ?? "Helvetica", size: 30.0)
  163. if cellFont == nil {
  164. cellFont = UIFont(name: "Helvetica-Oblique", size: 30)
  165. }
  166. self.textField?.font = cellFont
  167. self.createButton = UIButton()
  168. self.createButton?.layer.cornerRadius = 25.0
  169. self.createButton?.clipsToBounds = true
  170. self.createButton?.setImage(UIImage(named: "CPDFSignatureImageAdd", in: Bundle(for: self.classForCoder), compatibleWith: nil), for: .normal)
  171. self.createButton?.backgroundColor = UIColor.blue
  172. self.createButton?.addTarget(self, action: #selector(buttonItemClicked_create(_:)), for: .touchUpInside)
  173. if(createButton != nil) {
  174. self.view.addSubview(self.createButton!)
  175. }
  176. self.createButton?.isHidden = true
  177. self.clearButton = UIButton()
  178. self.clearButton?.setImage(UIImage(named: "CPDFSignatureImageClean", in: Bundle(for: self.classForCoder), compatibleWith: nil), for: .normal)
  179. self.clearButton?.titleLabel?.adjustsFontSizeToFitWidth = true
  180. self.clearButton?.autoresizingMask = [.flexibleLeftMargin, .flexibleBottomMargin]
  181. self.clearButton?.layer.borderColor = UIColor.gray.cgColor
  182. self.clearButton?.layer.borderWidth = 1.0
  183. self.clearButton?.layer.cornerRadius = 25.0
  184. self.clearButton?.layer.masksToBounds = true
  185. self.clearButton?.setTitleColor(UIColor.gray, for: .normal)
  186. self.clearButton?.addTarget(self, action: #selector(buttonItemClicked_clear(_:)), for: .touchUpInside)
  187. if(clearButton != nil) {
  188. self.view.addSubview(self.clearButton!)
  189. }
  190. self.selectedIndex = .defaults
  191. self.view.backgroundColor = CPDFColorUtils.CAnnotationPropertyViewControllerBackgoundColor()
  192. createGestureRecognizer()
  193. updatePreferredContentSizeWithTraitCollection(traitCollection: traitCollection)
  194. self.isImageSignature = false
  195. self.isDrawSignature = false
  196. self.isImageSignature = false
  197. }
  198. override func viewWillLayoutSubviews() {
  199. super.viewWillLayoutSubviews()
  200. headerView?.frame = CGRect(x: 0, y: 0, width: view.frame.size.width, height: 50)
  201. segmentedControl?.frame = CGRect(x: (view.frame.size.width - 220)/2, y: 10, width: 220, height: 30)
  202. emptyLabel?.frame = CGRect(x: (view.frame.size.width - 200)/2, y: (view.frame.size.height - 50)/2, width: 200, height: 50)
  203. if #available(iOS 11.0, *) {
  204. let currentOrientation = UIApplication.shared.statusBarOrientation
  205. if currentOrientation.isPortrait {
  206. colorSelectView?.frame = CGRect(x: view.safeAreaInsets.left, y: 50, width: 380, height: 60)
  207. fontSettingView?.frame = CGRect(x: view.safeAreaInsets.left, y: 140, width: 380, height: 30)
  208. colorSelectView?.colorPickerView?.frame = CGRect(x: 0, y: 0, width: colorSelectView?.frame.size.width ?? 0, height: colorSelectView?.frame.size.height ?? 0)
  209. thicknessView?.frame = CGRect(x: view.safeAreaInsets.left, y: 140, width: view.frame.size.width-view.safeAreaInsets.left-view.safeAreaInsets.right, height: 60)
  210. thicknessLabel?.frame = CGRect(x: 20, y: 15, width: 60, height: 30)
  211. thicknessSlider?.frame = CGRect(x: 90, y: 0, width: (thicknessView?.bounds.size.width ?? 0)-110, height: 60)
  212. 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)
  213. } else if currentOrientation.isLandscape {
  214. colorSelectView?.frame = CGRect(x: view.safeAreaInsets.left, y: 50, width: 380, height: 60)
  215. let maxX = colorSelectView?.frame.maxX ?? 0
  216. fontSettingView?.frame = CGRect(x: maxX + 10, y: (colorSelectView?.frame.midY ?? 0), width: self.view.frame.width - maxX - 10, height: 30)
  217. thicknessView?.frame = CGRect(x: 380, y: 70, width: view.frame.size.width-380-view.safeAreaInsets.right, height: 60)
  218. thicknessLabel?.frame = CGRect(x: 20, y: 15, width: 60, height: 30)
  219. thicknessSlider?.frame = CGRect(x: 90, y: 0, width: (thicknessView?.bounds.size.width ?? 0)-110, height: 60)
  220. 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)
  221. }
  222. saveButton?.frame = CGRect(x: view.frame.size.width - 60 - view.safeAreaInsets.right, y: 5, width: 50, height: 40)
  223. cancelButton?.frame = CGRect(x: view.safeAreaInsets.left+20, y: 5, width: 50, height: 40)
  224. 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)
  225. 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)
  226. 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)
  227. } else {
  228. let currentOrientation = UIApplication.shared.statusBarOrientation
  229. if currentOrientation.isPortrait {
  230. colorSelectView?.frame = CGRect(x: 10, y: 50, width: 380, height: 60)
  231. fontSettingView?.frame = CGRect(x: 10, y: 140, width: 380, height: 30)
  232. colorSelectView?.colorPickerView?.frame = CGRect(x: 0, y: 0, width: colorSelectView?.frame.size.width ?? 0, height: colorSelectView?.frame.size.height ?? 0)
  233. thicknessView?.frame = CGRect(x: 10, y: 140, width: view.frame.size.width-20, height: 60)
  234. thicknessLabel?.frame = CGRect(x: 20, y: 15, width: 60, height: 30)
  235. thicknessSlider?.frame = CGRect(x: 90, y: 0, width: (thicknessView?.bounds.size.width ?? 0)-110, height: 60)
  236. signatureDrawTextView?.frame = CGRect(x: 10, y: 210, width: view.frame.size.width-20, height: view.frame.size.height-114-150)
  237. } else if currentOrientation.isLandscape {
  238. colorSelectView?.frame = CGRect(x: 10, y: 50, width: 380, height: 60)
  239. let maxX = colorSelectView?.frame.maxX ?? 0
  240. fontSettingView?.frame = CGRect(x: maxX + 10, y: (colorSelectView?.frame.midY ?? 0), width: self.view.frame.width - maxX - 10, height: 30)
  241. thicknessView?.frame = CGRect(x: 380, y: 70, width: view.frame.size.width-380-10, height: 60)
  242. thicknessLabel?.frame = CGRect(x: 20, y: 15, width: 60, height: 30)
  243. thicknessSlider?.frame = CGRect(x: 90, y: 0, width: (thicknessView?.bounds.size.width ?? 0)-110, height: 60)
  244. signatureDrawTextView?.frame = CGRect(x: 10, y: 130, width: view.frame.size.width-20, height: view.frame.size.height-114-130)
  245. }
  246. signatureDrawImageView?.frame = signatureDrawTextView?.frame ?? CGRect.zero
  247. createButton?.frame = CGRect(x: view.frame.size.width - 70, y: view.frame.size.height - 100, width: 50, height: 50)
  248. clearButton?.frame = CGRect(x: view.frame.size.width - 70, y: view.frame.size.height - 100, width: 50, height: 50)
  249. saveButton?.frame = CGRect(x: view.frame.size.width - 60, y: 5, width: 50, height: 40)
  250. cancelButton?.frame = CGRect(x: 20, y: 5, width: 50, height: 40)
  251. }
  252. textField?.frame = CGRect(x: (view.frame.size.width - 300)/2, y: 200, width: 300, height: 100)
  253. }
  254. override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
  255. if segmentedControl?.selectedSegmentIndex == 1 {
  256. textField?.resignFirstResponder()
  257. } else if (segmentedControl?.selectedSegmentIndex == 0) || (segmentedControl?.selectedSegmentIndex == 2) {
  258. signatureDrawTextView?.signatureClear();
  259. }
  260. }
  261. override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
  262. super.willTransition(to: newCollection, with: coordinator)
  263. updatePreferredContentSizeWithTraitCollection(traitCollection: newCollection)
  264. }
  265. // MARK: - Private Methods
  266. func initSegmentedControl() {
  267. let segmmentArray = [NSLocalizedString("Trackpad", comment: ""), NSLocalizedString("Keyboard", comment: ""), NSLocalizedString("Image", comment: "")]
  268. segmentedControl = UISegmentedControl(items: segmmentArray)
  269. segmentedControl?.selectedSegmentIndex = 0
  270. segmentedControl?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  271. segmentedControl?.addTarget(self, action: #selector(segmentedControlValueChanged_singature(_:)), for: .valueChanged)
  272. if(segmentedControl != nil) {
  273. self.view.addSubview(segmentedControl!)
  274. }
  275. }
  276. func updatePreferredContentSizeWithTraitCollection(traitCollection: UITraitCollection) {
  277. if self.colorPicker?.superview != nil {
  278. let currentDevice = UIDevice.current
  279. if currentDevice.userInterfaceIdiom == .pad {
  280. // This is an iPad
  281. self.preferredContentSize = CGSize(width: self.view.bounds.size.width, height: 520)
  282. } else {
  283. // This is an iPhone or iPod touch
  284. self.preferredContentSize = CGSize(width: self.view.bounds.size.width, height: 320)
  285. }
  286. } else {
  287. let width = UIScreen.main.bounds.size.width
  288. let height = UIScreen.main.bounds.size.height
  289. let mWidth = min(width, height)
  290. let mHeight = max(width, height)
  291. let currentDevice = UIDevice.current
  292. if currentDevice.userInterfaceIdiom == .pad {
  293. // This is an iPad
  294. self.preferredContentSize = CGSize(width: self.view.bounds.size.width, height: traitCollection.verticalSizeClass == .compact ? mWidth * 0.5 : mHeight * 0.6)
  295. } else {
  296. // This is an iPhone or iPod touch
  297. self.preferredContentSize = CGSize(width: self.view.bounds.size.width, height: traitCollection.verticalSizeClass == .compact ? mWidth * 0.9 : mHeight * 0.9)
  298. }
  299. }
  300. }
  301. func createGestureRecognizer() {
  302. self.createButton?.isUserInteractionEnabled = true
  303. let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panaddBookmarkBtn(_:)))
  304. self.createButton?.addGestureRecognizer(panRecognizer)
  305. }
  306. @objc func panaddBookmarkBtn(_ gestureRecognizer: UIPanGestureRecognizer) {
  307. let point = gestureRecognizer.translation(in: self.view)
  308. let newX = (self.createButton?.center.x ?? 0) + point.x
  309. let newY = (self.createButton?.center.y ?? 0 ) + point.y
  310. if self.view.frame.contains(CGPoint(x: newX, y: newY)) {
  311. self.createButton?.center = CGPoint(x: newX, y: newY)
  312. }
  313. gestureRecognizer.setTranslation(.zero, in: self.view)
  314. }
  315. func image(with view: UIView) -> UIImage? {
  316. UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0)
  317. if let ctx = UIGraphicsGetCurrentContext() {
  318. view.layer.render(in: ctx)
  319. let image = UIGraphicsGetImageFromCurrentImageContext()
  320. UIGraphicsEndImageContext()
  321. return image
  322. }
  323. return nil
  324. }
  325. func labelAutoCalculateRect(with text: String, font: UIFont) -> CGSize {
  326. let paragraphStyle = NSMutableParagraphStyle()
  327. let maxSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)
  328. paragraphStyle.lineBreakMode = NSLineBreakMode.byWordWrapping
  329. let attributes: [NSAttributedString.Key: Any] = [
  330. NSAttributedString.Key.font: font,
  331. NSAttributedString.Key.paragraphStyle: paragraphStyle
  332. ]
  333. var labelSize = (text as NSString).boundingRect(with: maxSize, options: [.usesLineFragmentOrigin, .usesFontLeading, .truncatesLastVisibleLine], attributes: attributes, context: nil).size
  334. labelSize.height = ceil(labelSize.height)
  335. labelSize.width = ceil(labelSize.width)
  336. return labelSize
  337. }
  338. func initDrawSignatureViewProperties() {
  339. self.colorSelectView?.isHidden = false
  340. self.signatureDrawTextView?.isHidden = false
  341. self.selectedIndex? = .defaults
  342. self.colorSelectView?.isHidden = false
  343. self.clearButton?.isHidden = false
  344. self.signatureDrawTextView?.selectIndex = .text
  345. self.emptyLabel?.isHidden = false
  346. self.thicknessView?.isHidden = false
  347. self.signatureDrawImageView?.isHidden = true
  348. self.createButton?.isHidden = true
  349. self.textField?.isHidden = true
  350. fontSettingView?.isHidden = true
  351. self.textField?.resignFirstResponder()
  352. if self.isDrawSignature {
  353. self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
  354. self.saveButton?.isEnabled = true
  355. } else {
  356. self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
  357. self.saveButton?.isEnabled = false
  358. }
  359. }
  360. func initTextSignatureViewProperties() {
  361. self.colorSelectView?.isHidden = false
  362. self.signatureDrawTextView?.isHidden = true
  363. self.signatureDrawImageView?.isHidden = true
  364. self.textField?.isHidden = false
  365. fontSettingView?.isHidden = false
  366. self.selectedIndex = .text
  367. self.colorSelectView?.isHidden = false
  368. self.createButton?.isHidden = true
  369. self.thicknessView?.isHidden = true
  370. self.clearButton?.isHidden = false
  371. self.emptyLabel?.isHidden = true
  372. self.textField?.becomeFirstResponder()
  373. if self.isTextSignature {
  374. self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
  375. self.saveButton?.isEnabled = true
  376. } else {
  377. self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
  378. self.saveButton?.isEnabled = false
  379. }
  380. }
  381. func initImageSignatureViewProperties() {
  382. self.textField?.resignFirstResponder()
  383. self.colorSelectView?.isHidden = true
  384. self.signatureDrawTextView?.isHidden = true
  385. self.signatureDrawImageView?.isHidden = false
  386. self.textField?.isHidden = true
  387. fontSettingView?.isHidden = true
  388. self.selectedIndex = .image
  389. self.createButton?.isHidden = false
  390. self.colorSelectView?.isHidden = true
  391. self.signatureDrawImageView?.selectIndex = .image
  392. self.thicknessView?.isHidden = true
  393. self.clearButton?.isHidden = true
  394. self.emptyLabel?.isHidden = true
  395. self.signatureDrawImageView?.setNeedsDisplay()
  396. if self.isImageSignature {
  397. self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
  398. self.saveButton?.isEnabled = true
  399. } else {
  400. self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
  401. self.saveButton?.isEnabled = false
  402. }
  403. }
  404. // MARK: - Action
  405. @objc func buttonItemClicked_Save(_ sender: Any) {
  406. if .defaults == self.selectedIndex {
  407. let image = self.signatureDrawTextView?.signatureImage()
  408. if(image != nil) {
  409. delegate?.signatureEditViewController?(self, image: image ?? UIImage())
  410. }
  411. } else if .image == self.selectedIndex {
  412. self.signatureDrawTextView?.signatureClear()
  413. let image = self.signatureDrawImageView?.signatureImage()
  414. if(image != nil) {
  415. delegate?.signatureEditViewController?(self, image: image ?? UIImage())
  416. }
  417. } else if .text == self.selectedIndex {
  418. let image = createTextSignature()
  419. if self.textField!.text?.isEmpty ?? true {
  420. let alertController = UIAlertController(title: "Info", message: "Please input Signature", preferredStyle: .alert)
  421. let cancelAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
  422. alertController.addAction(cancelAction)
  423. self.present(alertController, animated: true, completion: nil)
  424. return
  425. }
  426. if (self.textField?.text) != nil {
  427. delegate?.signatureEditViewController?(self, image: image )
  428. }
  429. }
  430. }
  431. @objc func buttonItemClicked_Cancel(_ sender: Any) {
  432. self.dismiss(animated: true, completion: nil)
  433. }
  434. @objc func buttonItemClicked_create(_ sender: Any) {
  435. createImageSignature()
  436. }
  437. @objc func segmentedControlValueChanged_singature(_ sender: Any) {
  438. if self.segmentedControl?.selectedSegmentIndex == 0 {
  439. initDrawSignatureViewProperties()
  440. } else if self.segmentedControl?.selectedSegmentIndex == 1 {
  441. initTextSignatureViewProperties()
  442. } else if self.segmentedControl?.selectedSegmentIndex == 2 {
  443. initImageSignatureViewProperties()
  444. }
  445. }
  446. @objc func buttonItemClicked_changes(_ sender: UISlider) {
  447. self.signatureDrawTextView?.lineWidth = CGFloat(sender.value)
  448. self.signatureDrawTextView?.setNeedsDisplay()
  449. }
  450. @objc func buttonItemClicked_clear(_ button: UIButton) {
  451. if self.segmentedControl?.selectedSegmentIndex == 0 {
  452. self.signatureDrawTextView?.signatureClear()
  453. self.emptyLabel?.text = NSLocalizedString("Enter your signature", comment: "")
  454. self.isDrawSignature = false
  455. self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
  456. self.saveButton?.isEnabled = false
  457. } else if self.segmentedControl?.selectedSegmentIndex == 1 {
  458. self.textField?.text = ""
  459. self.isTextSignature = false
  460. self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
  461. self.saveButton?.isEnabled = false
  462. }
  463. }
  464. @objc func textTextField_change(_ textField: UITextField) {
  465. if self.textField?.text?.count ?? 0 > 0 {
  466. self.isTextSignature = true
  467. self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
  468. self.saveButton?.isEnabled = true
  469. } else {
  470. self.isTextSignature = false
  471. self.saveButton?.setTitleColor(UIColor.gray, for: .normal)
  472. self.saveButton?.isEnabled = false
  473. }
  474. }
  475. // MARK: - UITextFieldDelegate
  476. func textFieldDidBeginEditing(_ textField: UITextField) {
  477. if UIApplication.shared.statusBarOrientation.isPortrait {
  478. UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseIn, animations: {
  479. self.clearButton?.center = CGPoint(x: self.clearButton?.center.x ?? 0, y: (self.clearButton?.center.y ?? 0)-300)
  480. }, completion: nil)
  481. } else {
  482. UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseIn, animations: {
  483. self.clearButton?.center = CGPoint(x: self.clearButton?.center.x ?? 0, y: (self.clearButton?.center.y ?? 0)-150)
  484. self.textField?.center = CGPoint(x: self.textField?.center.x ?? 0, y: (self.textField?.center.y ?? 0)-150)
  485. }, completion: nil)
  486. self.colorSelectView?.isHidden = true
  487. }
  488. }
  489. func textFieldDidEndEditing(_ textField: UITextField) {
  490. if UIApplication.shared.statusBarOrientation.isPortrait {
  491. UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseIn, animations: {
  492. self.clearButton?.center = CGPoint(x: self.clearButton?.center.x ?? 0, y: (self.clearButton?.center.y ?? 0)+300)
  493. }, completion: nil)
  494. } else {
  495. UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseIn, animations: {
  496. self.clearButton?.center = CGPoint(x: self.clearButton?.center.x ?? 0, y: (self.clearButton?.center.y ?? 0)+150)
  497. self.textField?.center = CGPoint(x: self.textField?.center.x ?? 0, y: (self.textField?.center.y ?? 0)+150)
  498. }, completion: nil)
  499. self.colorSelectView?.isHidden = false
  500. }
  501. }
  502. func textFieldShouldReturn(_ textField: UITextField) -> Bool {
  503. textField.resignFirstResponder()
  504. return true
  505. }
  506. // MARK: - Private Methods
  507. func createImageSignature() {
  508. let cameraAction = UIAlertAction(title: NSLocalizedString("Camera", comment: ""), style: .default) { (action) in
  509. let imagePickerController = UIImagePickerController()
  510. imagePickerController.delegate = self
  511. imagePickerController.sourceType = .camera
  512. self.present(imagePickerController, animated: true, completion: nil)
  513. }
  514. let photoAction = UIAlertAction(title: NSLocalizedString("Choose from Album", comment: ""), style: .default) { (action) in
  515. let imagePickerController = UIImagePickerController()
  516. imagePickerController.delegate = self
  517. imagePickerController.sourceType = .photoLibrary
  518. imagePickerController.allowsEditing = true
  519. imagePickerController.modalPresentationStyle = .popover
  520. if UI_USER_INTERFACE_IDIOM() == .pad {
  521. if(self.segmentedControl != nil){
  522. imagePickerController.popoverPresentationController?.sourceView = self.segmentedControl!
  523. imagePickerController.popoverPresentationController?.sourceRect = CGRect(x: self.segmentedControl!.bounds.maxX, y: self.segmentedControl!.bounds.maxY, width: 1, height: 1)
  524. }
  525. }
  526. self.present(imagePickerController, animated: true, completion: nil)
  527. }
  528. let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel, handler: nil)
  529. let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
  530. if UI_USER_INTERFACE_IDIOM() == .pad {
  531. if (self.segmentedControl != nil) {
  532. actionSheet.popoverPresentationController?.sourceView = self.segmentedControl!
  533. actionSheet.popoverPresentationController?.sourceRect = CGRect(x: self.segmentedControl!.bounds.maxX, y: self.segmentedControl!.bounds.maxY, width: 1, height: 1)
  534. }
  535. }
  536. actionSheet.addAction(cameraAction)
  537. actionSheet.addAction(photoAction)
  538. actionSheet.addAction(cancelAction)
  539. actionSheet.modalPresentationStyle = .popover
  540. self.present(actionSheet, animated: true, completion: nil)
  541. }
  542. func createTextSignature() -> UIImage {
  543. if self.textField?.text?.count ?? 0 < 1 {
  544. return UIImage()
  545. }
  546. let string = self.textField?.text ?? ""
  547. let font = self.textField?.font
  548. let size = labelAutoCalculateRect(with: string, font: font ?? UIFont())
  549. let sideH = size.height + 10
  550. var w = size.width
  551. if w + 10 > kKMSignayureTextMaxWidth {
  552. w = kKMSignayureTextMaxWidth - 10
  553. }
  554. let backView = UIView(frame: CGRect(x: 0, y: 0, width: w + 10, height: sideH))
  555. backView.backgroundColor = UIColor.clear
  556. let label = UILabel(frame: CGRect(x: 5, y: 5, width: w, height: size.height))
  557. label.font = font
  558. label.text = string
  559. label.textAlignment = .center
  560. label.numberOfLines = 1
  561. label.textColor = self.textField?.textColor
  562. label.adjustsFontSizeToFitWidth = true
  563. backView.addSubview(label)
  564. let newImage = image(with: backView) ?? UIImage()
  565. return newImage
  566. }
  567. // MARK: - UIImagePickerControllerDelegate
  568. func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
  569. picker.dismiss(animated: true, completion: nil)
  570. var image: UIImage?
  571. if let editedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage {
  572. image = editedImage
  573. } else if let originalImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
  574. image = originalImage
  575. }
  576. if image != nil {
  577. self.isImageSignature = true
  578. self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
  579. self.saveButton?.isEnabled = true
  580. }
  581. if let imageOrientation = image?.imageOrientation, imageOrientation != .up {
  582. UIGraphicsBeginImageContext(image?.size ?? CGSize.zero)
  583. image?.draw(in: CGRect(x: 0, y: 0, width: image?.size.width ?? 0, height: image?.size.height ?? 0))
  584. image = UIGraphicsGetImageFromCurrentImageContext()
  585. UIGraphicsEndImageContext()
  586. }
  587. if let imageData = image?.pngData(), var image = UIImage(data: imageData) {
  588. let colorMasking: [CGFloat] = [222, 255, 222, 255, 222, 255]
  589. let imageRef = image.cgImage?.copy(maskingColorComponents: colorMasking)
  590. if let imageRef = imageRef {
  591. image = UIImage(cgImage: imageRef)
  592. }
  593. self.signatureDrawImageView?.image = image
  594. self.signatureDrawImageView?.setNeedsDisplay()
  595. }
  596. }
  597. func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
  598. picker.dismiss(animated: true)
  599. }
  600. // MARK: - CPDFColorSelectViewDelegate
  601. func selectColorView(_ select: CPDFColorSelectView, color: UIColor) {
  602. self.textField?.textColor = color
  603. self.signatureDrawTextView?.color = color
  604. self.signatureDrawTextView?.setNeedsDisplay()
  605. }
  606. func selectColorView(_ select: CPDFColorSelectView) {
  607. if #available(iOS 14.0, *) {
  608. let picker = UIColorPickerViewController()
  609. picker.delegate = self
  610. self.present(picker, animated: true, completion: nil)
  611. } else {
  612. let currentDevice = UIDevice.current
  613. if currentDevice.userInterfaceIdiom == .pad {
  614. // This is an iPad
  615. 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))
  616. } else {
  617. // This is an iPhone or iPod touch
  618. 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))
  619. }
  620. self.colorPicker?.delegate = self
  621. self.colorPicker?.backgroundColor = CPDFColorUtils.CAnnotationPropertyViewControllerBackgoundColor()
  622. if(self.colorPicker != nil) {
  623. self.view.addSubview(self.colorPicker!)
  624. }
  625. self.updatePreferredContentSizeWithTraitCollection(traitCollection: traitCollection)
  626. }
  627. }
  628. // MARK: - CPDFColorPickerViewDelegate
  629. func pickerView(_ colorPickerView: CPDFColorPickerView, color: UIColor) {
  630. signatureDrawTextView?.color = color
  631. self.textField?.textColor = color
  632. self.signatureDrawTextView?.color = color
  633. self.signatureDrawTextView?.setNeedsDisplay()
  634. self.updatePreferredContentSizeWithTraitCollection(traitCollection: traitCollection)
  635. }
  636. // MARK: - UIColorPickerViewControllerDelegate
  637. @available(iOS 14.0, *)
  638. func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
  639. signatureDrawTextView?.color = viewController.selectedColor
  640. self.textField?.textColor = viewController.selectedColor
  641. self.signatureDrawTextView?.setNeedsDisplay()
  642. }
  643. // MARK: - CSignatureDrawViewDelegate
  644. func signatureDrawViewStart(_ signatureDrawView: CSignatureDrawView) {
  645. if self.segmentedControl?.selectedSegmentIndex == 0 {
  646. self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
  647. self.saveButton?.isEnabled = true
  648. self.isDrawSignature = true
  649. self.emptyLabel?.text = ""
  650. } else if self.segmentedControl?.selectedSegmentIndex == 2 {
  651. self.saveButton?.setTitleColor(UIColor(red: 20.0/255.0, green: 96.0/255.0, blue: 243.0/255.0, alpha: 1.0), for: .normal)
  652. self.saveButton?.isEnabled = true
  653. self.isImageSignature = true
  654. self.emptyLabel?.text = ""
  655. }
  656. }
  657. // MARK: - CPDFFontSettingViewDelegate
  658. func setCPDFFontSettingViewFontSelect(view: CPDFFontSettingSubView,isFontStyle:Bool) {
  659. fontStyleTableView = CPDFFontStyleTableView(frame: self.view.bounds, familyNames: view.fontNameSelectLabel?.text ?? "Helvetica", styleName: baseStyleName,isFontStyle: isFontStyle)
  660. self.fontStyleTableView?.delegate = self
  661. self.fontStyleTableView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  662. self.fontStyleTableView?.backgroundColor = CPDFColorUtils.CAnnotationPropertyViewControllerBackgoundColor()
  663. if(self.fontStyleTableView != nil) {
  664. self.view.addSubview(self.fontStyleTableView!)
  665. }
  666. self.textField?.endEditing(true)
  667. }
  668. // MARK: - CPDFFontStyleTableViewDelegate
  669. func fontStyleTableView(_ fontStyleTableView: CPDFFontStyleTableView, fontName: String, isFontStyle: Bool) {
  670. var familyName = baseName
  671. if(isFontStyle) {
  672. baseStyleName = fontName
  673. } else {
  674. baseName = fontName;
  675. familyName = fontName
  676. let datasArray:[String] = CPDFFont.fontNames(forFamilyName: familyName)
  677. baseStyleName = datasArray.first ?? ""
  678. }
  679. self.fontSettingView?.fontNameSelectLabel?.text = familyName
  680. self.fontSettingView?.fontStyleNameSelectLabel?.text = baseStyleName
  681. let cFont = CPDFFont(familyName: baseName, fontStyle: baseStyleName )
  682. var cellFont = UIFont.init(name: CPDFFont.convertAppleFont(cFont) ?? "Helvetica", size: 30.0)
  683. if cellFont == nil {
  684. cellFont = UIFont(name: "Helvetica-Oblique", size: 30)
  685. }
  686. self.textField?.font = cellFont
  687. }
  688. }