KMDesignTextField.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. //
  2. // KMDesignTextField.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2023/6/7.
  6. //
  7. // 输入框 组件
  8. class KMDesignTextField: KMDesignBaseView {
  9. private var textField: KMCustomTextField?
  10. private var _designSize: KMDesignSize = .medium
  11. var designSize: KMDesignSize {
  12. get {
  13. return self._designSize
  14. }
  15. }
  16. var stringValue: String? {
  17. get {
  18. return self.textField?.stringValue
  19. }
  20. set {
  21. self.textField?.stringValue = newValue ?? ""
  22. }
  23. }
  24. override var kmEnabled: Bool {
  25. get {
  26. return super.kmEnabled
  27. }
  28. set {
  29. super.kmEnabled = newValue
  30. self.textField?.kmEnabled = newValue
  31. if (newValue) {
  32. // self.window?.makeFirstResponder(self.textField)
  33. } else {
  34. self.window?.makeFirstResponder(nil)
  35. }
  36. }
  37. }
  38. weak var delegate: KMTextFieldDelegate?
  39. var kFormatter: Formatter? {
  40. set {
  41. self.textField?.textFiled.formatter = newValue
  42. }
  43. get {
  44. return self.textField?.textFiled.formatter
  45. }
  46. }
  47. var enterKeyEndEdit: Bool {
  48. set {
  49. let textFiled = self.textField?.textFiled as? KMTextField
  50. textFiled?.enterKeyEndEdit = newValue
  51. }
  52. get {
  53. let textFiled = self.textField?.textFiled as? KMTextField
  54. return textFiled?.enterKeyEndEdit ?? false
  55. }
  56. }
  57. convenience init(designSize: KMDesignSize = .medium) {
  58. self.init()
  59. self._designSize = designSize
  60. }
  61. override func initSubViews() {
  62. super.initSubViews()
  63. let textFiled = KMCustomTextField()
  64. self.addSubview(textFiled)
  65. self.textField = textFiled
  66. self.textField?.delegate = self
  67. }
  68. override func initDefaultValue() {
  69. super.initDefaultValue()
  70. self.textField?.backgroundView.wantsLayer = true
  71. self.textField?.hoverAction = { [unowned self] sender, action in
  72. if (!self.canHover()) {
  73. return
  74. }
  75. if (action == .enter) {
  76. self.state = .Hov
  77. } else if (action == .exit) {
  78. self.state = .Norm
  79. }
  80. }
  81. let model = KMDesignToken.shared.tokenUsesModel(withToken: self.find_bgToken(state: .Norm))
  82. if let data = model.height as? String, let _height = Float(data) {
  83. self.height = CGFloat(_height)
  84. }
  85. if let data = model.horizontalPadding as? String, let _vSpace = Float(data) {
  86. self.horizontalPadding = CGFloat(_vSpace)
  87. self.textField?.offset = self.horizontalPadding
  88. }
  89. self.state = .Norm
  90. }
  91. override func layout() {
  92. super.layout()
  93. let width: CGFloat = NSWidth(self.bounds)
  94. let heigth: CGFloat = NSHeight(self.bounds)
  95. let y: CGFloat = (heigth - self.height) * 0.5
  96. self.textField?.frame = NSMakeRect(0, y, width, self.height)
  97. }
  98. override func find_bgToken(state: KMDesignTokenState) -> KMDesignTokenKey {
  99. if (state == .Norm) {
  100. return self.designSize == .medium ? "input.m.bg.norm" : "input.s.bg.norm"
  101. } else if (state == .Hov) {
  102. return self.designSize == .medium ? "input.m.bg.hov" : "input.s.bg.hov"
  103. } else if (state == .Focus) {
  104. return self.designSize == .medium ? "input.m.bg.focus" : "input.s.bg.focus"
  105. } else if (state == .Disabled) {
  106. return self.designSize == .medium ? "input.m.bg.dis" : "input.s.bg.dis"
  107. } else if (state == .Error_def) {
  108. return self.designSize == .medium ? "input.m.bg.error-def" : "input.s.bg.error-def"
  109. } else if (state == .Error_focus) {
  110. return self.designSize == .medium ? "input.m.bg.error-focus" : "input.s.bg.error-focus"
  111. }
  112. return KMDesignTokenNone
  113. }
  114. override func updateUI(state: KMDesignTokenState) {
  115. super.updateUI(state: state)
  116. self.textField?.backgroundView.layer?.backgroundColor = self.fillColor.cgColor
  117. self.textField?.backgroundView.layer?.borderWidth = self.borderWidth
  118. self.textField?.backgroundView.layer?.borderColor = self.borderColor.cgColor
  119. self.textField?.backgroundView.layer?.cornerRadius = self.borderRadius
  120. }
  121. }
  122. extension KMDesignTextField: KMTextFieldDelegate {
  123. func km_didBecomeFirstResponder(textField: AnyObject) {
  124. if (textField.isEqual(to: self.textField)) {
  125. self.state = .Focus
  126. }
  127. self.delegate?.km_didBecomeFirstResponder(textField: self)
  128. }
  129. func km_controlTextShouldBeginEditing(textField: AnyObject) -> Bool {
  130. if let should = self.delegate?.km_controlTextShouldBeginEditing(textField: self) {
  131. return should
  132. }
  133. return true
  134. }
  135. func km_controlTextDidBeginEditing(textField: AnyObject) {
  136. self.delegate?.km_controlTextDidBeginEditing(textField: self)
  137. }
  138. func km_controlTextDidChange(textField: AnyObject) {
  139. self.delegate?.km_controlTextDidChange(textField: self)
  140. }
  141. func km_controlTextShouldEndEditing(textField: AnyObject) -> Bool {
  142. if let should = self.delegate?.km_controlTextShouldEndEditing(textField: self) {
  143. return should
  144. }
  145. return true
  146. }
  147. func km_controlTextDidEndEditing(textField: AnyObject) {
  148. if (textField.isEqual(to: self.textField)) {
  149. self.state = .Norm
  150. }
  151. self.delegate?.km_controlTextDidEndEditing(textField: self)
  152. }
  153. }