IQUIView+IQKeyboardToolbar.swift 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. //
  2. // IQUIView+IQKeyboardToolbar.swift
  3. // https://github.com/hackiftekhar/IQKeyboardManager
  4. // Copyright (c) 2013-16 Iftekhar Qurashi.
  5. //
  6. // Permission is hereby granted, free of charge, to any person obtaining a copy
  7. // of this software and associated documentation files (the "Software"), to deal
  8. // in the Software without restriction, including without limitation the rights
  9. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. // copies of the Software, and to permit persons to whom the Software is
  11. // furnished to do so, subject to the following conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be included in
  14. // all copies or substantial portions of the Software.
  15. //
  16. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. // THE SOFTWARE.
  23. import UIKit
  24. private var kIQShouldHideToolbarPlaceholder = "kIQShouldHideToolbarPlaceholder"
  25. private var kIQToolbarPlaceholder = "kIQToolbarPlaceholder"
  26. private var kIQKeyboardToolbar = "kIQKeyboardToolbar"
  27. /**
  28. IQBarButtonItemConfiguration for creating toolbar with bar button items
  29. */
  30. @objc public class IQBarButtonItemConfiguration: NSObject {
  31. #if swift(>=4.2)
  32. @objc public init(barButtonSystemItem: UIBarButtonItem.SystemItem, action: Selector) {
  33. self.barButtonSystemItem = barButtonSystemItem
  34. self.image = nil
  35. self.title = nil
  36. self.action = action
  37. super.init()
  38. }
  39. #else
  40. @objc public init(barButtonSystemItem: UIBarButtonSystemItem, action: Selector) {
  41. self.barButtonSystemItem = barButtonSystemItem
  42. self.image = nil
  43. self.title = nil
  44. self.action = action
  45. super.init()
  46. }
  47. #endif
  48. @objc public init(image: UIImage, action: Selector) {
  49. self.barButtonSystemItem = nil
  50. self.image = image
  51. self.title = nil
  52. self.action = action
  53. super.init()
  54. }
  55. @objc public init(title: String, action: Selector) {
  56. self.barButtonSystemItem = nil
  57. self.image = nil
  58. self.title = title
  59. self.action = action
  60. super.init()
  61. }
  62. #if swift(>=4.2)
  63. public let barButtonSystemItem: UIBarButtonItem.SystemItem? //System Item to be used to instantiate bar button.
  64. #else
  65. public let barButtonSystemItem: UIBarButtonSystemItem? //System Item to be used to instantiate bar button.
  66. #endif
  67. @objc public let image: UIImage? //Image to show on bar button item if it's not a system item.
  68. @objc public let title: String? //Title to show on bar button item if it's not a system item.
  69. @objc public let action: Selector? //action for bar button item. Usually 'doneAction:(IQBarButtonItem*)item'.
  70. }
  71. /**
  72. UIImage category methods to get next/prev images
  73. */
  74. @objc public extension UIImage {
  75. static func keyboardPreviousiOS9Image() -> UIImage? {
  76. struct Static {
  77. static var keyboardPreviousiOS9Image: UIImage?
  78. }
  79. if Static.keyboardPreviousiOS9Image == nil {
  80. // Get the top level "bundle" which may actually be the framework
  81. var bundle = Bundle(for: IQKeyboardManager.self)
  82. if let resourcePath = bundle.path(forResource: "IQKeyboardManager", ofType: "bundle") {
  83. if let resourcesBundle = Bundle(path: resourcePath) {
  84. bundle = resourcesBundle
  85. }
  86. }
  87. Static.keyboardPreviousiOS9Image = UIImage(named: "IQButtonBarArrowLeft", in: bundle, compatibleWith: nil)
  88. //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
  89. if #available(iOS 9, *) {
  90. Static.keyboardPreviousiOS9Image = Static.keyboardPreviousiOS9Image?.imageFlippedForRightToLeftLayoutDirection()
  91. }
  92. }
  93. return Static.keyboardPreviousiOS9Image
  94. }
  95. static func keyboardNextiOS9Image() -> UIImage? {
  96. struct Static {
  97. static var keyboardNextiOS9Image: UIImage?
  98. }
  99. if Static.keyboardNextiOS9Image == nil {
  100. // Get the top level "bundle" which may actually be the framework
  101. var bundle = Bundle(for: IQKeyboardManager.self)
  102. if let resourcePath = bundle.path(forResource: "IQKeyboardManager", ofType: "bundle") {
  103. if let resourcesBundle = Bundle(path: resourcePath) {
  104. bundle = resourcesBundle
  105. }
  106. }
  107. Static.keyboardNextiOS9Image = UIImage(named: "IQButtonBarArrowRight", in: bundle, compatibleWith: nil)
  108. //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
  109. if #available(iOS 9, *) {
  110. Static.keyboardNextiOS9Image = Static.keyboardNextiOS9Image?.imageFlippedForRightToLeftLayoutDirection()
  111. }
  112. }
  113. return Static.keyboardNextiOS9Image
  114. }
  115. static func keyboardPreviousiOS10Image() -> UIImage? {
  116. struct Static {
  117. static var keyboardPreviousiOS10Image: UIImage?
  118. }
  119. if Static.keyboardPreviousiOS10Image == nil {
  120. // Get the top level "bundle" which may actually be the framework
  121. var bundle = Bundle(for: IQKeyboardManager.self)
  122. if let resourcePath = bundle.path(forResource: "IQKeyboardManager", ofType: "bundle") {
  123. if let resourcesBundle = Bundle(path: resourcePath) {
  124. bundle = resourcesBundle
  125. }
  126. }
  127. Static.keyboardPreviousiOS10Image = UIImage(named: "IQButtonBarArrowUp", in: bundle, compatibleWith: nil)
  128. //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
  129. if #available(iOS 9, *) {
  130. Static.keyboardPreviousiOS10Image = Static.keyboardPreviousiOS10Image?.imageFlippedForRightToLeftLayoutDirection()
  131. }
  132. }
  133. return Static.keyboardPreviousiOS10Image
  134. }
  135. static func keyboardNextiOS10Image() -> UIImage? {
  136. struct Static {
  137. static var keyboardNextiOS10Image: UIImage?
  138. }
  139. if Static.keyboardNextiOS10Image == nil {
  140. // Get the top level "bundle" which may actually be the framework
  141. var bundle = Bundle(for: IQKeyboardManager.self)
  142. if let resourcePath = bundle.path(forResource: "IQKeyboardManager", ofType: "bundle") {
  143. if let resourcesBundle = Bundle(path: resourcePath) {
  144. bundle = resourcesBundle
  145. }
  146. }
  147. Static.keyboardNextiOS10Image = UIImage(named: "IQButtonBarArrowDown", in: bundle, compatibleWith: nil)
  148. //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
  149. if #available(iOS 9, *) {
  150. Static.keyboardNextiOS10Image = Static.keyboardNextiOS10Image?.imageFlippedForRightToLeftLayoutDirection()
  151. }
  152. }
  153. return Static.keyboardNextiOS10Image
  154. }
  155. static func keyboardPreviousImage() -> UIImage? {
  156. if #available(iOS 10, *) {
  157. return keyboardPreviousiOS10Image()
  158. } else {
  159. return keyboardPreviousiOS9Image()
  160. }
  161. }
  162. static func keyboardNextImage() -> UIImage? {
  163. if #available(iOS 10, *) {
  164. return keyboardNextiOS10Image()
  165. } else {
  166. return keyboardNextiOS9Image()
  167. }
  168. }
  169. }
  170. /**
  171. UIView category methods to add IQToolbar on UIKeyboard.
  172. */
  173. @objc public extension UIView {
  174. ///--------------
  175. // MARK: Toolbar
  176. ///--------------
  177. /**
  178. IQToolbar references for better customization control.
  179. */
  180. var keyboardToolbar: IQToolbar {
  181. var toolbar = inputAccessoryView as? IQToolbar
  182. if toolbar == nil {
  183. toolbar = objc_getAssociatedObject(self, &kIQKeyboardToolbar) as? IQToolbar
  184. }
  185. if let unwrappedToolbar = toolbar {
  186. return unwrappedToolbar
  187. } else {
  188. let newToolbar = IQToolbar()
  189. objc_setAssociatedObject(self, &kIQKeyboardToolbar, newToolbar, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  190. return newToolbar
  191. }
  192. }
  193. ///--------------------
  194. // MARK: Toolbar title
  195. ///--------------------
  196. /**
  197. If `shouldHideToolbarPlaceholder` is YES, then title will not be added to the toolbar. Default to NO.
  198. */
  199. var shouldHideToolbarPlaceholder: Bool {
  200. get {
  201. let aValue = objc_getAssociatedObject(self, &kIQShouldHideToolbarPlaceholder) as Any?
  202. if let unwrapedValue = aValue as? Bool {
  203. return unwrapedValue
  204. } else {
  205. return false
  206. }
  207. }
  208. set(newValue) {
  209. objc_setAssociatedObject(self, &kIQShouldHideToolbarPlaceholder, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  210. self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder
  211. }
  212. }
  213. /**
  214. `toolbarPlaceholder` to override default `placeholder` text when drawing text on toolbar.
  215. */
  216. var toolbarPlaceholder: String? {
  217. get {
  218. let aValue = objc_getAssociatedObject(self, &kIQToolbarPlaceholder) as? String
  219. return aValue
  220. }
  221. set(newValue) {
  222. objc_setAssociatedObject(self, &kIQToolbarPlaceholder, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  223. self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder
  224. }
  225. }
  226. /**
  227. `drawingToolbarPlaceholder` will be actual text used to draw on toolbar. This would either `placeholder` or `toolbarPlaceholder`.
  228. */
  229. var drawingToolbarPlaceholder: String? {
  230. if self.shouldHideToolbarPlaceholder {
  231. return nil
  232. } else if self.toolbarPlaceholder?.isEmpty == false {
  233. return self.toolbarPlaceholder
  234. } else if self.responds(to: #selector(getter: UITextField.placeholder)) {
  235. if let textField = self as? UITextField {
  236. return textField.placeholder
  237. } else if let textView = self as? IQTextView {
  238. return textView.placeholder
  239. } else {
  240. return nil
  241. }
  242. } else {
  243. return nil
  244. }
  245. }
  246. ///---------------------
  247. // MARK: Private helper
  248. ///---------------------
  249. private static func flexibleBarButtonItem () -> IQBarButtonItem {
  250. struct Static {
  251. static let nilButton = IQBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
  252. }
  253. Static.nilButton.isSystemItem = true
  254. return Static.nilButton
  255. }
  256. ///-------------
  257. // MARK: Common
  258. ///-------------
  259. func addKeyboardToolbarWithTarget(target: AnyObject?, titleText: String?, rightBarButtonConfiguration: IQBarButtonItemConfiguration?, previousBarButtonConfiguration: IQBarButtonItemConfiguration? = nil, nextBarButtonConfiguration: IQBarButtonItemConfiguration? = nil) {
  260. //If can't set InputAccessoryView. Then return
  261. if self.responds(to: #selector(setter: UITextField.inputAccessoryView)) {
  262. // Creating a toolBar for phoneNumber keyboard
  263. let toolbar = self.keyboardToolbar
  264. var items: [IQBarButtonItem] = []
  265. if let prevConfig = previousBarButtonConfiguration {
  266. var prev = toolbar.previousBarButton
  267. if prevConfig.barButtonSystemItem == nil && prev.isSystemItem == false {
  268. prev.title = prevConfig.title
  269. prev.image = prevConfig.image
  270. prev.target = target
  271. prev.action = prevConfig.action
  272. } else {
  273. if let systemItem = prevConfig.barButtonSystemItem {
  274. prev = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: prevConfig.action)
  275. prev.isSystemItem = true
  276. } else if let image = prevConfig.image {
  277. prev = IQBarButtonItem(image: image, style: .plain, target: target, action: prevConfig.action)
  278. } else {
  279. prev = IQBarButtonItem(title: prevConfig.title, style: .plain, target: target, action: prevConfig.action)
  280. }
  281. prev.invocation = toolbar.previousBarButton.invocation
  282. prev.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel
  283. prev.isEnabled = toolbar.previousBarButton.isEnabled
  284. prev.tag = toolbar.previousBarButton.tag
  285. toolbar.previousBarButton = prev
  286. }
  287. items.append(prev)
  288. }
  289. if previousBarButtonConfiguration != nil && nextBarButtonConfiguration != nil {
  290. items.append(toolbar.fixedSpaceBarButton)
  291. }
  292. if let nextConfig = nextBarButtonConfiguration {
  293. var next = toolbar.nextBarButton
  294. if nextConfig.barButtonSystemItem == nil && next.isSystemItem == false {
  295. next.title = nextConfig.title
  296. next.image = nextConfig.image
  297. next.target = target
  298. next.action = nextConfig.action
  299. } else {
  300. if let systemItem = nextConfig.barButtonSystemItem {
  301. next = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: nextConfig.action)
  302. next.isSystemItem = true
  303. } else if let image = nextConfig.image {
  304. next = IQBarButtonItem(image: image, style: .plain, target: target, action: nextConfig.action)
  305. } else {
  306. next = IQBarButtonItem(title: nextConfig.title, style: .plain, target: target, action: nextConfig.action)
  307. }
  308. next.invocation = toolbar.nextBarButton.invocation
  309. next.accessibilityLabel = toolbar.nextBarButton.accessibilityLabel
  310. next.isEnabled = toolbar.nextBarButton.isEnabled
  311. next.tag = toolbar.nextBarButton.tag
  312. toolbar.nextBarButton = next
  313. }
  314. items.append(next)
  315. }
  316. //Title bar button item
  317. do {
  318. //Flexible space
  319. items.append(UIView.flexibleBarButtonItem())
  320. //Title button
  321. toolbar.titleBarButton.title = titleText
  322. #if swift(>=3.2)
  323. if #available(iOS 11, *) {} else {
  324. toolbar.titleBarButton.customView?.frame = CGRect.zero
  325. }
  326. #else
  327. toolbar.titleBarButton.customView?.frame = CGRect.zero
  328. #endif
  329. items.append(toolbar.titleBarButton)
  330. //Flexible space
  331. items.append(UIView.flexibleBarButtonItem())
  332. }
  333. if let rightConfig = rightBarButtonConfiguration {
  334. var done = toolbar.doneBarButton
  335. if rightConfig.barButtonSystemItem == nil && done.isSystemItem == false {
  336. done.title = rightConfig.title
  337. done.image = rightConfig.image
  338. done.target = target
  339. done.action = rightConfig.action
  340. } else {
  341. if let systemItem = rightConfig.barButtonSystemItem {
  342. done = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: rightConfig.action)
  343. done.isSystemItem = true
  344. } else if let image = rightConfig.image {
  345. done = IQBarButtonItem(image: image, style: .plain, target: target, action: rightConfig.action)
  346. } else {
  347. done = IQBarButtonItem(title: rightConfig.title, style: .plain, target: target, action: rightConfig.action)
  348. }
  349. done.invocation = toolbar.doneBarButton.invocation
  350. done.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel
  351. done.isEnabled = toolbar.doneBarButton.isEnabled
  352. done.tag = toolbar.doneBarButton.tag
  353. toolbar.doneBarButton = done
  354. }
  355. items.append(done)
  356. }
  357. // Adding button to toolBar.
  358. toolbar.items = items
  359. // Setting toolbar to keyboard.
  360. if let textField = self as? UITextField {
  361. textField.inputAccessoryView = toolbar
  362. switch textField.keyboardAppearance {
  363. case .dark:
  364. toolbar.barStyle = UIBarStyle.black
  365. default:
  366. toolbar.barStyle = UIBarStyle.default
  367. }
  368. } else if let textView = self as? UITextView {
  369. textView.inputAccessoryView = toolbar
  370. switch textView.keyboardAppearance {
  371. case .dark:
  372. toolbar.barStyle = UIBarStyle.black
  373. default:
  374. toolbar.barStyle = UIBarStyle.default
  375. }
  376. }
  377. }
  378. }
  379. ///------------
  380. // MARK: Right
  381. ///------------
  382. func addDoneOnKeyboardWithTarget(_ target: AnyObject?, action: Selector, shouldShowPlaceholder: Bool = false) {
  383. addDoneOnKeyboardWithTarget(target, action: action, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil))
  384. }
  385. func addDoneOnKeyboardWithTarget(_ target: AnyObject?, action: Selector, titleText: String?) {
  386. let rightConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .done, action: action)
  387. addKeyboardToolbarWithTarget(target: target, titleText: titleText, rightBarButtonConfiguration: rightConfiguration)
  388. }
  389. func addRightButtonOnKeyboardWithImage(_ image: UIImage, target: AnyObject?, action: Selector, shouldShowPlaceholder: Bool = false) {
  390. addRightButtonOnKeyboardWithImage(image, target: target, action: action, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil))
  391. }
  392. func addRightButtonOnKeyboardWithImage(_ image: UIImage, target: AnyObject?, action: Selector, titleText: String?) {
  393. let rightConfiguration = IQBarButtonItemConfiguration(image: image, action: action)
  394. addKeyboardToolbarWithTarget(target: target, titleText: titleText, rightBarButtonConfiguration: rightConfiguration)
  395. }
  396. func addRightButtonOnKeyboardWithText(_ text: String, target: AnyObject?, action: Selector, shouldShowPlaceholder: Bool = false) {
  397. addRightButtonOnKeyboardWithText(text, target: target, action: action, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil))
  398. }
  399. func addRightButtonOnKeyboardWithText(_ text: String, target: AnyObject?, action: Selector, titleText: String?) {
  400. let rightConfiguration = IQBarButtonItemConfiguration(title: text, action: action)
  401. addKeyboardToolbarWithTarget(target: target, titleText: titleText, rightBarButtonConfiguration: rightConfiguration)
  402. }
  403. ///-----------------
  404. // MARK: Right/Left
  405. ///-----------------
  406. func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?, cancelAction: Selector, doneAction: Selector, shouldShowPlaceholder: Bool = false) {
  407. addCancelDoneOnKeyboardWithTarget(target, cancelAction: cancelAction, doneAction: doneAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil))
  408. }
  409. func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonTitle: String, rightButtonTitle: String, leftButtonAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false) {
  410. addRightLeftOnKeyboardWithTarget(target, leftButtonTitle: leftButtonTitle, rightButtonTitle: rightButtonTitle, leftButtonAction: leftButtonAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil))
  411. }
  412. func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonImage: UIImage, rightButtonImage: UIImage, leftButtonAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false) {
  413. addRightLeftOnKeyboardWithTarget(target, leftButtonImage: leftButtonImage, rightButtonImage: rightButtonImage, leftButtonAction: leftButtonAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil))
  414. }
  415. func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?, cancelAction: Selector, doneAction: Selector, titleText: String?) {
  416. let leftConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .cancel, action: cancelAction)
  417. let rightConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .done, action: doneAction)
  418. addKeyboardToolbarWithTarget(target: target, titleText: titleText, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: leftConfiguration)
  419. }
  420. func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonTitle: String, rightButtonTitle: String, leftButtonAction: Selector, rightButtonAction: Selector, titleText: String?) {
  421. let leftConfiguration = IQBarButtonItemConfiguration(title: leftButtonTitle, action: leftButtonAction)
  422. let rightConfiguration = IQBarButtonItemConfiguration(title: rightButtonTitle, action: rightButtonAction)
  423. addKeyboardToolbarWithTarget(target: target, titleText: titleText, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: leftConfiguration)
  424. }
  425. func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonImage: UIImage, rightButtonImage: UIImage, leftButtonAction: Selector, rightButtonAction: Selector, titleText: String?) {
  426. let leftConfiguration = IQBarButtonItemConfiguration(image: leftButtonImage, action: leftButtonAction)
  427. let rightConfiguration = IQBarButtonItemConfiguration(image: rightButtonImage, action: rightButtonAction)
  428. addKeyboardToolbarWithTarget(target: target, titleText: titleText, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: leftConfiguration)
  429. }
  430. ///--------------------------
  431. // MARK: Previous/Next/Right
  432. ///--------------------------
  433. func addPreviousNextDoneOnKeyboardWithTarget (_ target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector, shouldShowPlaceholder: Bool = false) {
  434. addPreviousNextDoneOnKeyboardWithTarget(target, previousAction: previousAction, nextAction: nextAction, doneAction: doneAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil))
  435. }
  436. func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonImage: UIImage, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false) {
  437. addPreviousNextRightOnKeyboardWithTarget(target, rightButtonImage: rightButtonImage, previousAction: previousAction, nextAction: nextAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil))
  438. }
  439. func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonTitle: String, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false) {
  440. addPreviousNextRightOnKeyboardWithTarget(target, rightButtonTitle: rightButtonTitle, previousAction: previousAction, nextAction: nextAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil))
  441. }
  442. func addPreviousNextDoneOnKeyboardWithTarget (_ target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector, titleText: String?) {
  443. let rightConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .done, action: doneAction)
  444. let nextConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardNextImage() ?? UIImage(), action: nextAction)
  445. let prevConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardPreviousImage() ?? UIImage(), action: previousAction)
  446. addKeyboardToolbarWithTarget(target: target, titleText: titleText, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: prevConfiguration, nextBarButtonConfiguration: nextConfiguration)
  447. }
  448. func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonImage: UIImage, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, titleText: String?) {
  449. let rightConfiguration = IQBarButtonItemConfiguration(image: rightButtonImage, action: rightButtonAction)
  450. let nextConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardNextImage() ?? UIImage(), action: nextAction)
  451. let prevConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardPreviousImage() ?? UIImage(), action: previousAction)
  452. addKeyboardToolbarWithTarget(target: target, titleText: titleText, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: prevConfiguration, nextBarButtonConfiguration: nextConfiguration)
  453. }
  454. func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonTitle: String, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, titleText: String?) {
  455. let rightConfiguration = IQBarButtonItemConfiguration(title: rightButtonTitle, action: rightButtonAction)
  456. let nextConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardNextImage() ?? UIImage(), action: nextAction)
  457. let prevConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardPreviousImage() ?? UIImage(), action: previousAction)
  458. addKeyboardToolbarWithTarget(target: target, titleText: titleText, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: prevConfiguration, nextBarButtonConfiguration: nextConfiguration)
  459. }
  460. }