IQUIView+IQKeyboardToolbar.m 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. //
  2. // IQUIView+IQKeyboardToolbar.m
  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 "IQUIView+IQKeyboardToolbar.h"
  24. #import "IQKeyboardManagerConstantsInternal.h"
  25. #import "IQKeyboardManager.h"
  26. #import <objc/runtime.h>
  27. #import <UIKit/UIImage.h>
  28. #import <UIKit/UILabel.h>
  29. #import <UIKit/UIAccessibility.h>
  30. @implementation IQBarButtonItemConfiguration
  31. -(instancetype)initWithBarButtonSystemItem:(UIBarButtonSystemItem)barButtonSystemItem action:(SEL)action
  32. {
  33. self = [super init];
  34. if (self) {
  35. _barButtonSystemItem = barButtonSystemItem;
  36. _action = action;
  37. }
  38. return self;
  39. }
  40. -(instancetype)initWithImage:(UIImage *)image action:(SEL)action
  41. {
  42. self = [super init];
  43. if (self) {
  44. _image = image;
  45. _action = action;
  46. }
  47. return self;
  48. }
  49. -(instancetype)initWithTitle:(NSString *)title action:(SEL)action
  50. {
  51. self = [super init];
  52. if (self) {
  53. _title = title;
  54. _action = action;
  55. }
  56. return self;
  57. }
  58. @end
  59. @implementation UIImage (IQKeyboardToolbarNextPreviousImage)
  60. +(UIImage*)keyboardPreviousiOS9Image
  61. {
  62. static UIImage *keyboardPreviousiOS9Image = nil;
  63. if (keyboardPreviousiOS9Image == nil)
  64. {
  65. // Get the top level "bundle" which may actually be the framework
  66. NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]];
  67. // Check to see if the resource bundle exists inside the top level bundle
  68. NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]];
  69. if (resourcesBundle == nil) {
  70. resourcesBundle = mainBundle;
  71. }
  72. keyboardPreviousiOS9Image = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil];;
  73. //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
  74. #ifdef __IPHONE_11_0
  75. if (@available(iOS 9.0, *)) {
  76. #endif
  77. if ([UIImage instancesRespondToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)])
  78. {
  79. keyboardPreviousiOS9Image = [keyboardPreviousiOS9Image imageFlippedForRightToLeftLayoutDirection];
  80. }
  81. #ifdef __IPHONE_11_0
  82. }
  83. #endif
  84. }
  85. return keyboardPreviousiOS9Image;
  86. }
  87. +(UIImage*)keyboardNextiOS9Image
  88. {
  89. static UIImage *keyboardNextiOS9Image = nil;
  90. if (keyboardNextiOS9Image == nil)
  91. {
  92. // Get the top level "bundle" which may actually be the framework
  93. NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]];
  94. // Check to see if the resource bundle exists inside the top level bundle
  95. NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]];
  96. if (resourcesBundle == nil) {
  97. resourcesBundle = mainBundle;
  98. }
  99. keyboardNextiOS9Image = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
  100. //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
  101. #ifdef __IPHONE_11_0
  102. if (@available(iOS 9.0, *)) {
  103. #endif
  104. if ([UIImage instancesRespondToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)])
  105. {
  106. keyboardNextiOS9Image = [keyboardNextiOS9Image imageFlippedForRightToLeftLayoutDirection];
  107. }
  108. #ifdef __IPHONE_11_0
  109. }
  110. #endif
  111. }
  112. return keyboardNextiOS9Image;
  113. }
  114. +(UIImage*)keyboardPreviousiOS10Image
  115. {
  116. static UIImage *keyboardPreviousiOS10Image = nil;
  117. if (keyboardPreviousiOS10Image == nil)
  118. {
  119. // Get the top level "bundle" which may actually be the framework
  120. NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]];
  121. // Check to see if the resource bundle exists inside the top level bundle
  122. NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]];
  123. if (resourcesBundle == nil) {
  124. resourcesBundle = mainBundle;
  125. }
  126. keyboardPreviousiOS10Image = [UIImage imageNamed:@"IQButtonBarArrowUp" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
  127. //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
  128. #ifdef __IPHONE_11_0
  129. if (@available(iOS 9.0, *)) {
  130. #endif
  131. if ([UIImage instancesRespondToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)])
  132. {
  133. keyboardPreviousiOS10Image = [keyboardPreviousiOS10Image imageFlippedForRightToLeftLayoutDirection];
  134. }
  135. #ifdef __IPHONE_11_0
  136. }
  137. #endif
  138. }
  139. return keyboardPreviousiOS10Image;
  140. }
  141. +(UIImage*)keyboardNextiOS10Image
  142. {
  143. static UIImage *keyboardNextiOS10Image = nil;
  144. if (keyboardNextiOS10Image == nil)
  145. {
  146. // Get the top level "bundle" which may actually be the framework
  147. NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]];
  148. // Check to see if the resource bundle exists inside the top level bundle
  149. NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]];
  150. if (resourcesBundle == nil) {
  151. resourcesBundle = mainBundle;
  152. }
  153. keyboardNextiOS10Image = [UIImage imageNamed:@"IQButtonBarArrowDown" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
  154. //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
  155. #ifdef __IPHONE_11_0
  156. if (@available(iOS 9.0, *)) {
  157. #endif
  158. if ([UIImage instancesRespondToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)])
  159. {
  160. keyboardNextiOS10Image = [keyboardNextiOS10Image imageFlippedForRightToLeftLayoutDirection];
  161. }
  162. #ifdef __IPHONE_11_0
  163. }
  164. #endif
  165. }
  166. return keyboardNextiOS10Image;
  167. }
  168. +(UIImage*)keyboardPreviousImage
  169. {
  170. #ifdef __IPHONE_11_0
  171. if (@available(iOS 10.0, *))
  172. #else
  173. if (IQ_IS_IOS10_OR_GREATER)
  174. #endif
  175. {
  176. return [UIImage keyboardPreviousiOS10Image];
  177. }
  178. else
  179. {
  180. return [UIImage keyboardPreviousiOS9Image];
  181. }
  182. }
  183. +(UIImage*)keyboardNextImage
  184. {
  185. #ifdef __IPHONE_11_0
  186. if (@available(iOS 10.0, *))
  187. #else
  188. if (IQ_IS_IOS10_OR_GREATER)
  189. #endif
  190. {
  191. return [UIImage keyboardNextiOS10Image];
  192. }
  193. else
  194. {
  195. return [UIImage keyboardNextiOS9Image];
  196. }
  197. }
  198. @end
  199. /*UIKeyboardToolbar Category implementation*/
  200. @implementation UIView (IQToolbarAddition)
  201. -(IQToolbar *)keyboardToolbar
  202. {
  203. IQToolbar *keyboardToolbar = nil;
  204. if ([[self inputAccessoryView] isKindOfClass:[IQToolbar class]])
  205. {
  206. keyboardToolbar = [self inputAccessoryView];
  207. }
  208. else
  209. {
  210. keyboardToolbar = objc_getAssociatedObject(self, @selector(keyboardToolbar));
  211. if (keyboardToolbar == nil)
  212. {
  213. keyboardToolbar = [[IQToolbar alloc] init];
  214. objc_setAssociatedObject(self, @selector(keyboardToolbar), keyboardToolbar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  215. }
  216. }
  217. return keyboardToolbar;
  218. }
  219. -(void)setShouldHideToolbarPlaceholder:(BOOL)shouldHideToolbarPlaceholder
  220. {
  221. objc_setAssociatedObject(self, @selector(shouldHideToolbarPlaceholder), @(shouldHideToolbarPlaceholder), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  222. self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder;
  223. }
  224. -(BOOL)shouldHideToolbarPlaceholder
  225. {
  226. NSNumber *shouldHideToolbarPlaceholder = objc_getAssociatedObject(self, @selector(shouldHideToolbarPlaceholder));
  227. return [shouldHideToolbarPlaceholder boolValue];
  228. }
  229. -(void)setToolbarPlaceholder:(NSString *)toolbarPlaceholder
  230. {
  231. objc_setAssociatedObject(self, @selector(toolbarPlaceholder), toolbarPlaceholder, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  232. self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder;
  233. }
  234. -(NSString *)toolbarPlaceholder
  235. {
  236. NSString *toolbarPlaceholder = objc_getAssociatedObject(self, @selector(toolbarPlaceholder));
  237. return toolbarPlaceholder;
  238. }
  239. -(NSString *)drawingToolbarPlaceholder
  240. {
  241. if (self.shouldHideToolbarPlaceholder)
  242. {
  243. return nil;
  244. }
  245. else if (self.toolbarPlaceholder.length != 0)
  246. {
  247. return self.toolbarPlaceholder;
  248. }
  249. else if ([self respondsToSelector:@selector(placeholder)])
  250. {
  251. return [(UITextField*)self placeholder];
  252. }
  253. else
  254. {
  255. return nil;
  256. }
  257. }
  258. #pragma mark - Private helper
  259. +(IQBarButtonItem*)flexibleBarButtonItem
  260. {
  261. static IQBarButtonItem *nilButton = nil;
  262. if (nilButton == nil)
  263. {
  264. nilButton = [[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
  265. }
  266. return nilButton;
  267. }
  268. #pragma mark - Common
  269. - (void)addKeyboardToolbarWithTarget:(id)target titleText:(NSString*)titleText rightBarButtonConfiguration:(IQBarButtonItemConfiguration*)rightBarButtonConfiguration previousBarButtonConfiguration:(IQBarButtonItemConfiguration*)previousBarButtonConfiguration nextBarButtonConfiguration:(IQBarButtonItemConfiguration*)nextBarButtonConfiguration
  270. {
  271. //If can't set InputAccessoryView. Then return
  272. if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return;
  273. // Creating a toolBar for phoneNumber keyboard
  274. IQToolbar *toolbar = self.keyboardToolbar;
  275. NSMutableArray<UIBarButtonItem*> *items = [[NSMutableArray alloc] init];
  276. if(previousBarButtonConfiguration)
  277. {
  278. IQBarButtonItem *prev = toolbar.previousBarButton;
  279. if (prev.isSystemItem == NO && (previousBarButtonConfiguration.image || previousBarButtonConfiguration.title))
  280. {
  281. prev.title = previousBarButtonConfiguration.title;
  282. prev.image = previousBarButtonConfiguration.image;
  283. prev.target = target;
  284. prev.action = previousBarButtonConfiguration.action;
  285. }
  286. else if (previousBarButtonConfiguration.image)
  287. {
  288. prev = [[IQBarButtonItem alloc] initWithImage:previousBarButtonConfiguration.image style:UIBarButtonItemStylePlain target:target action:previousBarButtonConfiguration.action];
  289. prev.invocation = toolbar.previousBarButton.invocation;
  290. prev.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel;
  291. toolbar.previousBarButton = prev;
  292. }
  293. else if (previousBarButtonConfiguration.title)
  294. {
  295. prev = [[IQBarButtonItem alloc] initWithTitle:previousBarButtonConfiguration.title style:UIBarButtonItemStylePlain target:target action:previousBarButtonConfiguration.action];
  296. prev.invocation = toolbar.previousBarButton.invocation;
  297. prev.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel;
  298. toolbar.previousBarButton = prev;
  299. }
  300. else
  301. {
  302. prev = [[IQBarButtonItem alloc] initWithBarButtonSystemItem:previousBarButtonConfiguration.barButtonSystemItem target:target action:previousBarButtonConfiguration.action];
  303. prev.invocation = toolbar.previousBarButton.invocation;
  304. prev.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel;
  305. toolbar.previousBarButton = prev;
  306. }
  307. [items addObject:prev];
  308. }
  309. if (previousBarButtonConfiguration != nil && nextBarButtonConfiguration != nil)
  310. {
  311. [items addObject:toolbar.fixedSpaceBarButton];
  312. }
  313. if(nextBarButtonConfiguration)
  314. {
  315. IQBarButtonItem *next = toolbar.nextBarButton;
  316. if (next.isSystemItem == NO && (nextBarButtonConfiguration.image || nextBarButtonConfiguration.title))
  317. {
  318. next.title = nextBarButtonConfiguration.title;
  319. next.image = nextBarButtonConfiguration.image;
  320. next.target = target;
  321. next.action = nextBarButtonConfiguration.action;
  322. }
  323. else if (nextBarButtonConfiguration.image)
  324. {
  325. next = [[IQBarButtonItem alloc] initWithImage:nextBarButtonConfiguration.image style:UIBarButtonItemStylePlain target:target action:nextBarButtonConfiguration.action];
  326. next.invocation = toolbar.nextBarButton.invocation;
  327. next.accessibilityLabel = toolbar.nextBarButton.accessibilityLabel;
  328. toolbar.nextBarButton = next;
  329. }
  330. else if (nextBarButtonConfiguration.title)
  331. {
  332. next = [[IQBarButtonItem alloc] initWithTitle:nextBarButtonConfiguration.title style:UIBarButtonItemStylePlain target:target action:nextBarButtonConfiguration.action];
  333. next.invocation = toolbar.nextBarButton.invocation;
  334. next.accessibilityLabel = toolbar.nextBarButton.accessibilityLabel;
  335. toolbar.nextBarButton = next;
  336. }
  337. else
  338. {
  339. next = [[IQBarButtonItem alloc] initWithBarButtonSystemItem:nextBarButtonConfiguration.barButtonSystemItem target:target action:nextBarButtonConfiguration.action];
  340. next.invocation = toolbar.nextBarButton.invocation;
  341. next.accessibilityLabel = toolbar.nextBarButton.accessibilityLabel;
  342. toolbar.nextBarButton = next;
  343. }
  344. [items addObject:next];
  345. }
  346. //Title
  347. {
  348. //Flexible space
  349. [items addObject:[[self class] flexibleBarButtonItem]];
  350. //Title button
  351. toolbar.titleBarButton.title = titleText;
  352. #ifdef __IPHONE_11_0
  353. if (@available(iOS 11.0, *)) {}
  354. else
  355. #endif
  356. {
  357. toolbar.titleBarButton.customView.frame = CGRectZero;
  358. }
  359. [items addObject:toolbar.titleBarButton];
  360. //Flexible space
  361. [items addObject:[[self class] flexibleBarButtonItem]];
  362. }
  363. if(rightBarButtonConfiguration)
  364. {
  365. IQBarButtonItem *done = toolbar.doneBarButton;
  366. if (done.isSystemItem == NO && (rightBarButtonConfiguration.image || rightBarButtonConfiguration.title))
  367. {
  368. done.title = rightBarButtonConfiguration.title;
  369. done.image = rightBarButtonConfiguration.image;
  370. done.target = target;
  371. done.action = rightBarButtonConfiguration.action;
  372. }
  373. else if (rightBarButtonConfiguration.image)
  374. {
  375. done = [[IQBarButtonItem alloc] initWithImage:rightBarButtonConfiguration.image style:UIBarButtonItemStylePlain target:target action:rightBarButtonConfiguration.action];
  376. done.invocation = toolbar.doneBarButton.invocation;
  377. done.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel;
  378. toolbar.doneBarButton = done;
  379. }
  380. else if (rightBarButtonConfiguration.title)
  381. {
  382. done = [[IQBarButtonItem alloc] initWithTitle:rightBarButtonConfiguration.title style:UIBarButtonItemStylePlain target:target action:rightBarButtonConfiguration.action];
  383. done.invocation = toolbar.doneBarButton.invocation;
  384. done.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel;
  385. toolbar.doneBarButton = done;
  386. }
  387. else
  388. {
  389. done = [[IQBarButtonItem alloc] initWithBarButtonSystemItem:rightBarButtonConfiguration.barButtonSystemItem target:target action:rightBarButtonConfiguration.action];
  390. done.invocation = toolbar.doneBarButton.invocation;
  391. done.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel;
  392. toolbar.doneBarButton = done;
  393. }
  394. [items addObject:done];
  395. }
  396. // Adding button to toolBar.
  397. [toolbar setItems:items];
  398. // Setting toolbar to keyboard.
  399. [(UITextField*)self setInputAccessoryView:toolbar];
  400. if ([self respondsToSelector:@selector(keyboardAppearance)])
  401. {
  402. switch ([(UITextField*)self keyboardAppearance])
  403. {
  404. case UIKeyboardAppearanceDark: toolbar.barStyle = UIBarStyleBlack; break;
  405. default: toolbar.barStyle = UIBarStyleDefault; break;
  406. }
  407. }
  408. }
  409. #pragma mark - Right
  410. - (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target action:(SEL)action
  411. {
  412. [self addRightButtonOnKeyboardWithText:text target:target action:action titleText:nil];
  413. }
  414. - (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
  415. {
  416. [self addRightButtonOnKeyboardWithText:text target:target action:action titleText:(shouldShowPlaceholder?[self drawingToolbarPlaceholder]:nil)];
  417. }
  418. - (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target action:(SEL)action titleText:(NSString*)titleText
  419. {
  420. IQBarButtonItemConfiguration *rightConfiguration = [[IQBarButtonItemConfiguration alloc] initWithTitle:text action:action];
  421. [self addKeyboardToolbarWithTarget:target titleText:titleText rightBarButtonConfiguration:rightConfiguration previousBarButtonConfiguration:nil nextBarButtonConfiguration:nil];
  422. }
  423. - (void)addRightButtonOnKeyboardWithImage:(UIImage*)image target:(id)target action:(SEL)action
  424. {
  425. [self addRightButtonOnKeyboardWithImage:image target:target action:action titleText:nil];
  426. }
  427. - (void)addRightButtonOnKeyboardWithImage:(UIImage*)image target:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
  428. {
  429. [self addRightButtonOnKeyboardWithImage:image target:target action:action titleText:(shouldShowPlaceholder?[self drawingToolbarPlaceholder]:nil)];
  430. }
  431. - (void)addRightButtonOnKeyboardWithImage:(UIImage*)image target:(id)target action:(SEL)action titleText:(NSString*)titleText
  432. {
  433. IQBarButtonItemConfiguration *rightConfiguration = [[IQBarButtonItemConfiguration alloc] initWithImage:image action:action];
  434. [self addKeyboardToolbarWithTarget:target titleText:titleText rightBarButtonConfiguration:rightConfiguration previousBarButtonConfiguration:nil nextBarButtonConfiguration:nil];
  435. }
  436. -(void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action
  437. {
  438. [self addDoneOnKeyboardWithTarget:target action:action titleText:nil];
  439. }
  440. -(void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
  441. {
  442. [self addDoneOnKeyboardWithTarget:target action:action titleText:(shouldShowPlaceholder?[self drawingToolbarPlaceholder]:nil)];
  443. }
  444. - (void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action titleText:(NSString*)titleText
  445. {
  446. IQBarButtonItemConfiguration *rightConfiguration = [[IQBarButtonItemConfiguration alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone action:action];
  447. [self addKeyboardToolbarWithTarget:target titleText:titleText rightBarButtonConfiguration:rightConfiguration previousBarButtonConfiguration:nil nextBarButtonConfiguration:nil];
  448. }
  449. - (void)addLeftRightOnKeyboardWithTarget:(id)target leftButtonTitle:(NSString*)leftTitle rightButtonTitle:(NSString*)rightTitle leftButtonAction:(SEL)leftAction rightButtonAction:(SEL)rightAction
  450. {
  451. [self addLeftRightOnKeyboardWithTarget:target leftButtonTitle:leftTitle rightButtonTitle:rightTitle leftButtonAction:leftAction rightButtonAction:rightAction titleText:nil];
  452. }
  453. - (void)addLeftRightOnKeyboardWithTarget:(id)target leftButtonTitle:(NSString*)leftTitle rightButtonTitle:(NSString*)rightTitle leftButtonAction:(SEL)leftAction rightButtonAction:(SEL)rightAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
  454. {
  455. [self addLeftRightOnKeyboardWithTarget:target leftButtonTitle:leftTitle rightButtonTitle:rightTitle leftButtonAction:leftAction rightButtonAction:rightAction titleText:(shouldShowPlaceholder?[self drawingToolbarPlaceholder]:nil)];
  456. }
  457. - (void)addLeftRightOnKeyboardWithTarget:(id)target leftButtonTitle:(NSString*)leftTitle rightButtonTitle:(NSString*)rightTitle leftButtonAction:(SEL)leftAction rightButtonAction:(SEL)rightAction titleText:(NSString*)titleText
  458. {
  459. IQBarButtonItemConfiguration *leftConfiguration = [[IQBarButtonItemConfiguration alloc] initWithTitle:leftTitle action:leftAction];
  460. IQBarButtonItemConfiguration *rightConfiguration = [[IQBarButtonItemConfiguration alloc] initWithTitle:rightTitle action:rightAction];
  461. [self addKeyboardToolbarWithTarget:target titleText:titleText rightBarButtonConfiguration:rightConfiguration previousBarButtonConfiguration:leftConfiguration nextBarButtonConfiguration:nil];
  462. }
  463. -(void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction
  464. {
  465. [self addCancelDoneOnKeyboardWithTarget:target cancelAction:cancelAction doneAction:doneAction titleText:nil];
  466. }
  467. -(void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
  468. {
  469. [self addCancelDoneOnKeyboardWithTarget:target cancelAction:cancelAction doneAction:doneAction titleText:(shouldShowPlaceholder?[self drawingToolbarPlaceholder]:nil)];
  470. }
  471. - (void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction titleText:(NSString*)titleText
  472. {
  473. IQBarButtonItemConfiguration *leftConfiguration = [[IQBarButtonItemConfiguration alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel action:cancelAction];
  474. IQBarButtonItemConfiguration *rightConfiguration = [[IQBarButtonItemConfiguration alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone action:doneAction];
  475. [self addKeyboardToolbarWithTarget:target titleText:titleText rightBarButtonConfiguration:rightConfiguration previousBarButtonConfiguration:leftConfiguration nextBarButtonConfiguration:nil];
  476. }
  477. -(void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)previousAction nextAction:(SEL)nextAction doneAction:(SEL)doneAction
  478. {
  479. [self addPreviousNextDoneOnKeyboardWithTarget:target previousAction:previousAction nextAction:nextAction doneAction:doneAction titleText:nil];
  480. }
  481. -(void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)previousAction nextAction:(SEL)nextAction doneAction:(SEL)doneAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
  482. {
  483. [self addPreviousNextDoneOnKeyboardWithTarget:target previousAction:previousAction nextAction:nextAction doneAction:doneAction titleText:(shouldShowPlaceholder?[self drawingToolbarPlaceholder]:nil)];
  484. }
  485. - (void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)previousAction nextAction:(SEL)nextAction doneAction:(SEL)doneAction titleText:(NSString*)titleText
  486. {
  487. IQBarButtonItemConfiguration *previousConfiguration = [[IQBarButtonItemConfiguration alloc] initWithImage:[UIImage keyboardPreviousImage] action:previousAction];
  488. IQBarButtonItemConfiguration *nextConfiguration = [[IQBarButtonItemConfiguration alloc] initWithImage:[UIImage keyboardNextImage] action:nextAction];
  489. IQBarButtonItemConfiguration *rightConfiguration = [[IQBarButtonItemConfiguration alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone action:doneAction];
  490. [self addKeyboardToolbarWithTarget:target titleText:titleText rightBarButtonConfiguration:rightConfiguration previousBarButtonConfiguration:previousConfiguration nextBarButtonConfiguration:nextConfiguration];
  491. }
  492. - (void)addPreviousNextRightOnKeyboardWithTarget:(nullable id)target rightButtonImage:(nullable UIImage*)rightButtonImage previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction rightButtonAction:(nullable SEL)rightButtonAction
  493. {
  494. [self addPreviousNextRightOnKeyboardWithTarget:target rightButtonImage:rightButtonImage previousAction:previousAction nextAction:nextAction rightButtonAction:rightButtonAction titleText:nil];
  495. }
  496. - (void)addPreviousNextRightOnKeyboardWithTarget:(nullable id)target rightButtonImage:(nullable UIImage*)rightButtonImage previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction rightButtonAction:(nullable SEL)rightButtonAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
  497. {
  498. [self addPreviousNextRightOnKeyboardWithTarget:target rightButtonImage:rightButtonImage previousAction:previousAction nextAction:nextAction rightButtonAction:rightButtonAction titleText:(shouldShowPlaceholder?[self drawingToolbarPlaceholder]:nil)];
  499. }
  500. - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonImage:(UIImage*)rightButtonImage previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction titleText:(NSString*)titleText
  501. {
  502. IQBarButtonItemConfiguration *previousConfiguration = [[IQBarButtonItemConfiguration alloc] initWithImage:[UIImage keyboardPreviousImage] action:previousAction];
  503. IQBarButtonItemConfiguration *nextConfiguration = [[IQBarButtonItemConfiguration alloc] initWithImage:[UIImage keyboardNextImage] action:nextAction];
  504. IQBarButtonItemConfiguration *rightConfiguration = [[IQBarButtonItemConfiguration alloc] initWithImage:rightButtonImage action:rightButtonAction];
  505. [self addKeyboardToolbarWithTarget:target titleText:titleText rightBarButtonConfiguration:rightConfiguration previousBarButtonConfiguration:previousConfiguration nextBarButtonConfiguration:nextConfiguration];
  506. }
  507. - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NSString*)rightButtonTitle previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction
  508. {
  509. [self addPreviousNextRightOnKeyboardWithTarget:target rightButtonTitle:rightButtonTitle previousAction:previousAction nextAction:nextAction rightButtonAction:rightButtonAction titleText:nil];
  510. }
  511. - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NSString*)rightButtonTitle previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
  512. {
  513. [self addPreviousNextRightOnKeyboardWithTarget:target rightButtonTitle:rightButtonTitle previousAction:previousAction nextAction:nextAction rightButtonAction:rightButtonAction titleText:(shouldShowPlaceholder?[self drawingToolbarPlaceholder]:nil)];
  514. }
  515. - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NSString*)rightButtonTitle previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction titleText:(NSString*)titleText
  516. {
  517. IQBarButtonItemConfiguration *previousConfiguration = [[IQBarButtonItemConfiguration alloc] initWithImage:[UIImage keyboardPreviousImage] action:previousAction];
  518. IQBarButtonItemConfiguration *nextConfiguration = [[IQBarButtonItemConfiguration alloc] initWithImage:[UIImage keyboardNextImage] action:nextAction];
  519. IQBarButtonItemConfiguration *rightConfiguration = [[IQBarButtonItemConfiguration alloc] initWithTitle:rightButtonTitle action:rightButtonAction];
  520. [self addKeyboardToolbarWithTarget:target titleText:titleText rightBarButtonConfiguration:rightConfiguration previousBarButtonConfiguration:previousConfiguration nextBarButtonConfiguration:nextConfiguration];
  521. }
  522. @end