NSUserDefaults+Utils.swift 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. //
  2. // NSUserDefaults+Utils.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 Foundation
  13. import UIKit
  14. extension UserDefaults {
  15. func PDFListViewColorForKey(_ key: String) -> UIColor? {
  16. if let colorString = self.object(forKey: key) {
  17. if let data = colorString as? Data {
  18. return NSKeyedUnarchiver.unarchiveObject(with: data) as? UIColor
  19. } else if let string = colorString as? String {
  20. return UserDefaults.colorWithHexString(string)
  21. }
  22. }
  23. return nil
  24. }
  25. func setPDFListViewColor(_ color: UIColor?, forKey key: String) {
  26. guard let color = color else {
  27. self.removeObject(forKey: key)
  28. return
  29. }
  30. let colorString = UserDefaults.hexStringWithAlphaColor(color)
  31. self.set(colorString, forKey: key)
  32. self.synchronize()
  33. }
  34. static func hexStringWithAlphaColor(_ color: UIColor) -> String? {
  35. guard let colorStr = UserDefaults.hexStringWithColor(color) else { return "" }
  36. var a: CGFloat = 1.0
  37. var r: CGFloat = 0.0
  38. var g: CGFloat = 0.0
  39. var b: CGFloat = 0.0
  40. color.getRed(&r, green: &g, blue: &b, alpha: &a)
  41. let alphaStr = UserDefaults.getHexByDecimal(Int(a) * 255)
  42. var finalAlphaStr = alphaStr
  43. if alphaStr.count < 2 {
  44. finalAlphaStr = "0" + alphaStr
  45. }
  46. return "#" + finalAlphaStr + colorStr
  47. }
  48. static func hexStringWithColor(_ color: UIColor) -> String? {
  49. guard let components = color.cgColor.components else {
  50. return nil
  51. }
  52. let r = components[0]
  53. let g = components[1]
  54. let b = components[2]
  55. return String(format: "%@%@%@", UserDefaults.colorString(withValue: r), UserDefaults.colorString(withValue: g), UserDefaults.colorString(withValue: b))
  56. }
  57. static func colorString(withValue value: CGFloat) -> String {
  58. let str = UserDefaults.getHexByDecimal(Int(value * 255))
  59. if str.count < 2 {
  60. return "0" + str
  61. }
  62. return str
  63. }
  64. static func getHexByDecimal(_ decimal: Int) -> String {
  65. var hex = ""
  66. var number = decimal
  67. var letter: String
  68. var decimalz = decimal
  69. for _ in 0..<9 {
  70. number = decimalz % 16
  71. decimalz = decimalz / 16
  72. switch number {
  73. case 10:
  74. letter = "A"
  75. case 11:
  76. letter = "B"
  77. case 12:
  78. letter = "C"
  79. case 13:
  80. letter = "D"
  81. case 14:
  82. letter = "E"
  83. case 15:
  84. letter = "F"
  85. default:
  86. letter = String(number)
  87. }
  88. hex = letter + hex
  89. if decimalz == 0 {
  90. break
  91. }
  92. }
  93. return hex
  94. }
  95. static func colorWithHexString(_ hexStr: String) -> UIColor? {
  96. var cString = hexStr.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
  97. // String should be 6 or 8 characters
  98. if cString.count < 6 {
  99. return nil
  100. }
  101. if cString.hasPrefix("0X") {
  102. cString = String(cString.dropFirst(2))
  103. }
  104. if cString.hasPrefix("#") {
  105. cString = String(cString.dropFirst())
  106. }
  107. if cString.count < 6 {
  108. return nil
  109. }
  110. if cString.count == 6 {
  111. let rRange = cString.startIndex ..< cString.index(cString.startIndex, offsetBy: 2)
  112. let rString = cString.substring(with: rRange)
  113. let gRange = cString.index(cString.startIndex, offsetBy: 2) ..< cString.index(cString.startIndex, offsetBy: 4)
  114. let gString = cString.substring(with: gRange)
  115. let bRange = cString.index(cString.startIndex, offsetBy: 4) ..< cString.index(cString.startIndex, offsetBy: 6)
  116. let bString = cString.substring(with: bRange)
  117. var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0
  118. Scanner(string: rString).scanHexInt32(&r)
  119. Scanner(string: gString).scanHexInt32(&g)
  120. Scanner(string: bString).scanHexInt32(&b)
  121. var alpha: CUnsignedInt = 255
  122. return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: CGFloat(alpha) / 255.0)
  123. } else if cString.count == 8 {
  124. let aRange = cString.startIndex ..< cString.index(cString.startIndex, offsetBy: 2)
  125. let aString = cString.substring(with: aRange)
  126. let rRange = cString.index(cString.startIndex, offsetBy: 2) ..< cString.index(cString.startIndex, offsetBy: 4)
  127. let rString = cString.substring(with: rRange)
  128. let gRange = cString.index(cString.startIndex, offsetBy: 4) ..< cString.index(cString.startIndex, offsetBy: 6)
  129. let gString = cString.substring(with: gRange)
  130. let bRange = cString.index(cString.startIndex, offsetBy: 6) ..< cString.index(cString.startIndex, offsetBy: 8)
  131. let bString = cString.substring(with: bRange)
  132. var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0, a:CUnsignedInt = 0
  133. Scanner(string: rString).scanHexInt32(&r)
  134. Scanner(string: gString).scanHexInt32(&g)
  135. Scanner(string: bString).scanHexInt32(&b)
  136. Scanner(string: aString).scanHexInt32(&a)
  137. return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: CGFloat(a) / 255.0)
  138. } else {
  139. return nil
  140. }
  141. }
  142. }