1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069 |
- //
- // IQUIView+IQKeyboardToolbar.m
- // https://github.com/hackiftekhar/IQKeyboardManager
- // Copyright (c) 2013-16 Iftekhar Qurashi.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to deal
- // in the Software without restriction, including without limitation the rights
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- // copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- // THE SOFTWARE.
- #import "IQUIView+IQKeyboardToolbar.h"
- #import "IQKeyboardManagerConstantsInternal.h"
- #import "IQKeyboardManager.h"
- #import <objc/runtime.h>
- #import <UIKit/UIImage.h>
- #import <UIKit/UILabel.h>
- #import <UIKit/UIAccessibility.h>
- /*UIKeyboardToolbar Category implementation*/
- @implementation UIView (IQToolbarAddition)
- -(IQToolbar *)keyboardToolbar
- {
- IQToolbar *keyboardToolbar = nil;
- if ([[self inputAccessoryView] isKindOfClass:[IQToolbar class]])
- {
- keyboardToolbar = [self inputAccessoryView];
- }
- else
- {
- keyboardToolbar = objc_getAssociatedObject(self, @selector(keyboardToolbar));
-
- if (keyboardToolbar == nil)
- {
- keyboardToolbar = [[IQToolbar alloc] init];
-
- objc_setAssociatedObject(self, @selector(keyboardToolbar), keyboardToolbar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }
- }
-
- return keyboardToolbar;
- }
- -(void)setShouldHideToolbarPlaceholder:(BOOL)shouldHideToolbarPlaceholder
- {
- objc_setAssociatedObject(self, @selector(shouldHideToolbarPlaceholder), @(shouldHideToolbarPlaceholder), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder;
- }
- -(BOOL)shouldHideToolbarPlaceholder
- {
- NSNumber *shouldHideToolbarPlaceholder = objc_getAssociatedObject(self, @selector(shouldHideToolbarPlaceholder));
- return [shouldHideToolbarPlaceholder boolValue];
- }
- -(void)setShouldHidePlaceholderText:(BOOL)shouldHidePlaceholderText
- {
- [self setShouldHideToolbarPlaceholder:shouldHidePlaceholderText];
- }
- -(BOOL)shouldHidePlaceholderText
- {
- return [self shouldHideToolbarPlaceholder];
- }
- -(void)setToolbarPlaceholder:(NSString *)toolbarPlaceholder
- {
- objc_setAssociatedObject(self, @selector(toolbarPlaceholder), toolbarPlaceholder, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder;
- }
- -(NSString *)toolbarPlaceholder
- {
- NSString *toolbarPlaceholder = objc_getAssociatedObject(self, @selector(toolbarPlaceholder));
- return toolbarPlaceholder;
- }
- -(void)setPlaceholderText:(NSString*)placeholderText
- {
- [self setToolbarPlaceholder:placeholderText];
- }
- -(NSString*)placeholderText
- {
- return [self toolbarPlaceholder];
- }
- -(NSString *)drawingToolbarPlaceholder
- {
- if (self.shouldHideToolbarPlaceholder)
- {
- return nil;
- }
- else if (self.toolbarPlaceholder.length != 0)
- {
- return self.toolbarPlaceholder;
- }
- else if ([self respondsToSelector:@selector(placeholder)])
- {
- return [(UITextField*)self placeholder];
- }
- else
- {
- return nil;
- }
- }
- -(NSString*)drawingPlaceholderText
- {
- return [self drawingToolbarPlaceholder];
- }
- #pragma mark - Private helper
- +(IQBarButtonItem*)flexibleBarButtonItem
- {
- static IQBarButtonItem *nilButton = nil;
-
- if (nilButton == nil)
- {
- nilButton = [[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
- }
-
- return nilButton;
- }
- #pragma mark - Toolbar on UIKeyboard
- - (void)addRightButtonOnKeyboardWithImage:(UIImage*)image target:(id)target action:(SEL)action titleText:(NSString*)titleText
- {
- // If can't set InputAccessoryView. Then return
- if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return;
-
- // Creating a toolBar for keyboard
- IQToolbar *toolbar = self.keyboardToolbar;
-
- if ([self respondsToSelector:@selector(keyboardAppearance)])
- {
- switch ([(UITextField*)self keyboardAppearance])
- {
- case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break;
- default: toolbar.barStyle = UIBarStyleDefault; break;
- }
- }
-
- NSMutableArray<UIBarButtonItem*> *items = [[NSMutableArray alloc] init];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
- //Title button
- toolbar.titleBarButton.title = self.shouldHideToolbarPlaceholder?nil:titleText;
- #ifdef __IPHONE_11_0
- if (@available(iOS 11.0, *)) {}
- else
- #endif
- {
- toolbar.titleBarButton.customView.frame = CGRectZero;
- }
- [items addObject:toolbar.titleBarButton];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Right button
- IQBarButtonItem *doneButton = toolbar.doneBarButton;
- if (doneButton.isSystemItem == NO)
- {
- doneButton.title = nil;
- doneButton.image = image;
- doneButton.target = target;
- doneButton.action = action;
- }
- else
- {
- doneButton = [[IQBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStyleDone target:target action:action];
- doneButton.invocation = toolbar.doneBarButton.invocation;
- doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel;
- toolbar.doneBarButton = doneButton;
- }
-
- [items addObject:doneButton];
-
- // Adding button to toolBar.
- [toolbar setItems:items];
-
- // Setting toolbar to keyboard.
- [(UITextField*)self setInputAccessoryView:toolbar];
- }
- - (void)addRightButtonOnKeyboardWithImage:(UIImage*)image target:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
- {
- NSString *title = nil;
-
- if (shouldShowPlaceholder)
- title = [self drawingToolbarPlaceholder];
-
- [self addRightButtonOnKeyboardWithImage:image target:target action:action titleText:title];
- }
- - (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target action:(SEL)action titleText:(NSString*)titleText
- {
- // If can't set InputAccessoryView. Then return
- if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return;
-
- // Creating a toolBar for keyboard
- IQToolbar *toolbar = self.keyboardToolbar;
- if ([self respondsToSelector:@selector(keyboardAppearance)])
- {
- switch ([(UITextField*)self keyboardAppearance])
- {
- case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break;
- default: toolbar.barStyle = UIBarStyleDefault; break;
- }
- }
-
- NSMutableArray<UIBarButtonItem*> *items = [[NSMutableArray alloc] init];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
- //Title button
- toolbar.titleBarButton.title = self.shouldHideToolbarPlaceholder?nil:titleText;
- #ifdef __IPHONE_11_0
- if (@available(iOS 11.0, *)) {}
- else
- #endif
- {
- toolbar.titleBarButton.customView.frame = CGRectZero;
- }
- [items addObject:toolbar.titleBarButton];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Right button
- IQBarButtonItem *doneButton = toolbar.doneBarButton;
- if (doneButton.isSystemItem == NO)
- {
- doneButton.title = text;
- doneButton.image = nil;
- doneButton.target = target;
- doneButton.action = action;
- }
- else
- {
- doneButton =[[IQBarButtonItem alloc] initWithTitle:text style:UIBarButtonItemStyleDone target:target action:action];
- doneButton.invocation = toolbar.doneBarButton.invocation;
- doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel;
- toolbar.doneBarButton = doneButton;
- }
- [items addObject:doneButton];
-
- // Adding button to toolBar.
- [toolbar setItems:items];
-
- // Setting toolbar to keyboard.
- [(UITextField*)self setInputAccessoryView:toolbar];
- }
- - (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
- {
- NSString *title = nil;
-
- if (shouldShowPlaceholder)
- title = [self drawingToolbarPlaceholder];
-
- [self addRightButtonOnKeyboardWithText:text target:target action:action titleText:title];
- }
- - (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target action:(SEL)action
- {
- [self addRightButtonOnKeyboardWithText:text target:target action:action titleText:nil];
- }
- - (void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action titleText:(NSString*)titleText
- {
- // If can't set InputAccessoryView. Then return
- if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return;
-
- // Creating a toolBar for keyboard
- IQToolbar *toolbar = self.keyboardToolbar;
- if ([self respondsToSelector:@selector(keyboardAppearance)])
- {
- switch ([(UITextField*)self keyboardAppearance])
- {
- case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break;
- default: toolbar.barStyle = UIBarStyleDefault; break;
- }
- }
-
- NSMutableArray<UIBarButtonItem*> *items = [[NSMutableArray alloc] init];
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
- //Title button
- toolbar.titleBarButton.title = self.shouldHideToolbarPlaceholder?nil:titleText;
- #ifdef __IPHONE_11_0
- if (@available(iOS 11.0, *)) {}
- else
- #endif
- {
- toolbar.titleBarButton.customView.frame = CGRectZero;
- }
- [items addObject:toolbar.titleBarButton];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Done button
- IQBarButtonItem *doneButton = toolbar.doneBarButton;
- if (doneButton.isSystemItem == NO)
- {
- doneButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:target action:action];
- doneButton.invocation = toolbar.doneBarButton.invocation;
- doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel;
- toolbar.doneBarButton = doneButton;
- }
- else
- {
- doneButton.target = target;
- doneButton.action = action;
- }
-
- [items addObject:doneButton];
-
- // Adding button to toolBar.
- [toolbar setItems:items];
-
- // Setting toolbar to keyboard.
- [(UITextField*)self setInputAccessoryView:toolbar];
- }
- -(void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
- {
- NSString *title = nil;
-
- if (shouldShowPlaceholder)
- title = [self drawingToolbarPlaceholder];
-
- [self addDoneOnKeyboardWithTarget:target action:action titleText:title];
- }
- -(void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action
- {
- [self addDoneOnKeyboardWithTarget:target action:action titleText:nil];
- }
- - (void)addLeftRightOnKeyboardWithTarget:(id)target leftButtonTitle:(NSString*)leftTitle rightButtonTitle:(NSString*)rightTitle leftButtonAction:(SEL)leftAction rightButtonAction:(SEL)rightAction titleText:(NSString*)titleText
- {
- // If can't set InputAccessoryView. Then return
- if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return;
-
- // Creating a toolBar for keyboard
- IQToolbar *toolbar = self.keyboardToolbar;
-
- if ([self respondsToSelector:@selector(keyboardAppearance)])
- {
- switch ([(UITextField*)self keyboardAppearance])
- {
- case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break;
- default: toolbar.barStyle = UIBarStyleDefault; break;
- }
- }
-
- NSMutableArray<UIBarButtonItem*> *items = [[NSMutableArray alloc] init];
-
- //Left button
- IQBarButtonItem *cancelButton = toolbar.previousBarButton;
- if (cancelButton.isSystemItem == NO)
- {
- cancelButton.title = leftTitle;
- cancelButton.image = nil;
- cancelButton.target = target;
- cancelButton.action = leftAction;
- }
- else
- {
- cancelButton = [[IQBarButtonItem alloc] initWithTitle:leftTitle style:UIBarButtonItemStylePlain target:target action:leftAction];
- cancelButton.invocation = toolbar.previousBarButton.invocation;
- cancelButton.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel;
- toolbar.previousBarButton = cancelButton;
- }
- [items addObject:cancelButton];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Title button
- toolbar.titleBarButton.title = self.shouldHideToolbarPlaceholder?nil:titleText;
- #ifdef __IPHONE_11_0
- if (@available(iOS 11.0, *)) {}
- else
- #endif
- {
- toolbar.titleBarButton.customView.frame = CGRectZero;
- }
- [items addObject:toolbar.titleBarButton];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Right button
- IQBarButtonItem *doneButton = toolbar.doneBarButton;
- if (doneButton.isSystemItem == NO)
- {
- doneButton.title = rightTitle;
- doneButton.image = nil;
- doneButton.target = target;
- doneButton.action = rightAction;
- }
- else
- {
- doneButton =[[IQBarButtonItem alloc] initWithTitle:rightTitle style:UIBarButtonItemStyleDone target:target action:rightAction];
- doneButton.invocation = toolbar.doneBarButton.invocation;
- doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel;
- toolbar.doneBarButton = doneButton;
- }
- [items addObject:doneButton];
-
- // Adding button to toolBar.
- [toolbar setItems:items];
-
- // Setting toolbar to keyboard.
- [(UITextField*)self setInputAccessoryView:toolbar];
- }
- - (void)addLeftRightOnKeyboardWithTarget:(id)target leftButtonTitle:(NSString*)leftTitle rightButtonTitle:(NSString*)rightTitle leftButtonAction:(SEL)leftAction rightButtonAction:(SEL)rightAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
- {
- NSString *title = nil;
-
- if (shouldShowPlaceholder)
- title = [self drawingToolbarPlaceholder];
-
- [self addLeftRightOnKeyboardWithTarget:target leftButtonTitle:leftTitle rightButtonTitle:rightTitle leftButtonAction:leftAction rightButtonAction:rightAction titleText:title];
- }
- - (void)addLeftRightOnKeyboardWithTarget:(id)target leftButtonTitle:(NSString*)leftTitle rightButtonTitle:(NSString*)rightTitle leftButtonAction:(SEL)leftAction rightButtonAction:(SEL)rightAction
- {
- [self addLeftRightOnKeyboardWithTarget:target leftButtonTitle:leftTitle rightButtonTitle:rightTitle leftButtonAction:leftAction rightButtonAction:rightAction titleText:nil];
- }
- - (void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction titleText:(NSString*)titleText
- {
- // If can't set InputAccessoryView. Then return
- if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return;
-
- // Creating a toolBar for keyboard
- IQToolbar *toolbar = self.keyboardToolbar;
- if ([self respondsToSelector:@selector(keyboardAppearance)])
- {
- switch ([(UITextField*)self keyboardAppearance])
- {
- case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break;
- default: toolbar.barStyle = UIBarStyleDefault; break;
- }
- }
-
- NSMutableArray<UIBarButtonItem*> *items = [[NSMutableArray alloc] init];
-
- //Cancel button
- IQBarButtonItem *cancelButton = toolbar.previousBarButton;
- if (cancelButton.isSystemItem == NO)
- {
- cancelButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:target action:cancelAction];
- cancelButton.invocation = toolbar.previousBarButton.invocation;
- cancelButton.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel;
- toolbar.previousBarButton = cancelButton;
- }
- else
- {
- cancelButton.target = target;
- cancelButton.action = cancelAction;
- }
- [items addObject:cancelButton];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Title button
- toolbar.titleBarButton.title = self.shouldHideToolbarPlaceholder?nil:titleText;
- #ifdef __IPHONE_11_0
- if (@available(iOS 11.0, *)) {}
- else
- #endif
- {
- toolbar.titleBarButton.customView.frame = CGRectZero;
- }
- [items addObject:toolbar.titleBarButton];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Done button
- IQBarButtonItem *doneButton = toolbar.doneBarButton;
- if (doneButton.isSystemItem == NO)
- {
- doneButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:target action:doneAction];
- doneButton.invocation = toolbar.doneBarButton.invocation;
- doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel;
- toolbar.doneBarButton = doneButton;
- }
- else
- {
- doneButton.target = target;
- doneButton.action = doneAction;
- }
- [items addObject:doneButton];
-
- // Adding button to toolBar.
- [toolbar setItems:items];
-
- // Setting toolbar to keyboard.
- [(UITextField*)self setInputAccessoryView:toolbar];
- }
- -(void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
- {
- NSString *title = nil;
-
- if (shouldShowPlaceholder)
- title = [self drawingToolbarPlaceholder];
-
- [self addCancelDoneOnKeyboardWithTarget:target cancelAction:cancelAction doneAction:doneAction titleText:title];
- }
- -(void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction
- {
- [self addCancelDoneOnKeyboardWithTarget:target cancelAction:cancelAction doneAction:doneAction titleText:nil];
- }
- - (void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)previousAction nextAction:(SEL)nextAction doneAction:(SEL)doneAction titleText:(NSString*)titleText
- {
- //If can't set InputAccessoryView. Then return
- if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return;
-
- // Creating a toolBar for phoneNumber keyboard
- IQToolbar *toolbar = self.keyboardToolbar;
- if ([self respondsToSelector:@selector(keyboardAppearance)])
- {
- switch ([(UITextField*)self keyboardAppearance])
- {
- case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break;
- default: toolbar.barStyle = UIBarStyleDefault; break;
- }
- }
-
- NSMutableArray<UIBarButtonItem*> *items = [[NSMutableArray alloc] init];
-
- // Get the top level "bundle" which may actually be the framework
- NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]];
-
- // Check to see if the resource bundle exists inside the top level bundle
- NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]];
-
- if (resourcesBundle == nil) {
- resourcesBundle = mainBundle;
- }
-
- UIImage *imageLeftArrow = nil;
- UIImage *imageRightArrow = nil;
-
- #ifdef __IPHONE_11_0
- if (@available(iOS 10.0, *))
- #else
- if (IQ_IS_IOS10_OR_GREATER)
- #endif
- {
- imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowUp" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
- imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowDown" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
- }
- else
- {
- imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
- imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
- }
- //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
- #ifdef __IPHONE_11_0
- if (@available(iOS 9.0, *)) {
- #endif
- if ([UIImage instancesRespondToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)])
- {
- imageLeftArrow = [imageLeftArrow imageFlippedForRightToLeftLayoutDirection];
- imageRightArrow = [imageRightArrow imageFlippedForRightToLeftLayoutDirection];
- }
- #ifdef __IPHONE_11_0
- }
- #endif
-
- //Previous button
- IQBarButtonItem *prev = toolbar.previousBarButton;
- if (prev.isSystemItem == NO)
- {
- prev.title = nil;
- prev.image = imageLeftArrow;
- prev.target = target;
- prev.action = previousAction;
- }
- else
- {
- prev = [[IQBarButtonItem alloc] initWithImage:imageLeftArrow style:UIBarButtonItemStylePlain target:target action:previousAction];
- prev.invocation = toolbar.previousBarButton.invocation;
- prev.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel;
- toolbar.previousBarButton = prev;
- }
-
- [items addObject:prev];
- //Fixed space
- IQBarButtonItem *fixed = toolbar.fixedSpaceBarButton;
-
- #ifdef __IPHONE_11_0
- if (@available(iOS 10.0, *))
- #else
- if (IQ_IS_IOS10_OR_GREATER)
- #endif
- {
- [fixed setWidth:6];
- }
- else
- {
- [fixed setWidth:20];
- }
- [items addObject:fixed];
-
- //Next button
- IQBarButtonItem *next = toolbar.nextBarButton;
- if (next.isSystemItem == NO)
- {
- next.title = nil;
- next.image = imageRightArrow;
- next.target = target;
- next.action = nextAction;
- }
- else
- {
- next = [[IQBarButtonItem alloc] initWithImage:imageRightArrow style:UIBarButtonItemStylePlain target:target action:nextAction];
- next.invocation = toolbar.nextBarButton.invocation;
- next.accessibilityLabel = toolbar.nextBarButton.accessibilityLabel;
- toolbar.nextBarButton = next;
- }
- [items addObject:next];
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Title button
- toolbar.titleBarButton.title = self.shouldHideToolbarPlaceholder?nil:titleText;
- #ifdef __IPHONE_11_0
- if (@available(iOS 11.0, *)) {}
- else
- #endif
- {
- toolbar.titleBarButton.customView.frame = CGRectZero;
- }
- [items addObject:toolbar.titleBarButton];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Done button
- IQBarButtonItem *doneButton = toolbar.doneBarButton;
- if (doneButton.isSystemItem == NO)
- {
- doneButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:target action:doneAction];
- doneButton.invocation = toolbar.doneBarButton.invocation;
- doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel;
- toolbar.doneBarButton = doneButton;
- }
- else
- {
- doneButton.target = target;
- doneButton.action = doneAction;
- }
- [items addObject:doneButton];
-
- // Adding button to toolBar.
- [toolbar setItems:items];
-
- // Setting toolbar to keyboard.
- [(UITextField*)self setInputAccessoryView:toolbar];
- }
- -(void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)previousAction nextAction:(SEL)nextAction doneAction:(SEL)doneAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
- {
- NSString *title = nil;
-
- if (shouldShowPlaceholder)
- title = [self drawingToolbarPlaceholder];
-
- [self addPreviousNextDoneOnKeyboardWithTarget:target previousAction:previousAction nextAction:nextAction doneAction:doneAction titleText:title];
- }
- -(void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)previousAction nextAction:(SEL)nextAction doneAction:(SEL)doneAction
- {
- [self addPreviousNextDoneOnKeyboardWithTarget:target previousAction:previousAction nextAction:nextAction doneAction:doneAction titleText:nil];
- }
- - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonImage:(UIImage*)rightButtonImage previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction titleText:(NSString*)titleText
- {
- //If can't set InputAccessoryView. Then return
- if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return;
-
- // Creating a toolBar for phoneNumber keyboard
- IQToolbar *toolbar = self.keyboardToolbar;
-
- if ([self respondsToSelector:@selector(keyboardAppearance)])
- {
- switch ([(UITextField*)self keyboardAppearance])
- {
- case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break;
- default: toolbar.barStyle = UIBarStyleDefault; break;
- }
- }
-
- NSMutableArray<UIBarButtonItem*> *items = [[NSMutableArray alloc] init];
-
- // Get the top level "bundle" which may actually be the framework
- NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]];
-
- // Check to see if the resource bundle exists inside the top level bundle
- NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]];
-
- if (resourcesBundle == nil) {
- resourcesBundle = mainBundle;
- }
-
- UIImage *imageLeftArrow = nil;
- UIImage *imageRightArrow = nil;
-
- #ifdef __IPHONE_11_0
- if (@available(iOS 10.0, *))
- #else
- if (IQ_IS_IOS10_OR_GREATER)
- #endif
- {
- imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowUp" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
- imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowDown" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
- }
- else
- {
- imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
- imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
- }
-
- //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
- #ifdef __IPHONE_11_0
- if (@available(iOS 9.0, *)) {
- #endif
- if ([UIImage instancesRespondToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)])
- {
- imageLeftArrow = [imageLeftArrow imageFlippedForRightToLeftLayoutDirection];
- imageRightArrow = [imageRightArrow imageFlippedForRightToLeftLayoutDirection];
- }
- #ifdef __IPHONE_11_0
- }
- #endif
- //Previous button
- IQBarButtonItem *prev = toolbar.previousBarButton;
- if (prev.isSystemItem == NO)
- {
- prev.title = nil;
- prev.image = imageLeftArrow;
- prev.target = target;
- prev.action = previousAction;
- }
- else
- {
- prev = [[IQBarButtonItem alloc] initWithImage:imageLeftArrow style:UIBarButtonItemStylePlain target:target action:previousAction];
- prev.invocation = toolbar.previousBarButton.invocation;
- prev.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel;
- toolbar.previousBarButton = prev;
- }
- [items addObject:prev];
-
- //Fixed space
- IQBarButtonItem *fixed = toolbar.fixedSpaceBarButton;
-
- #ifdef __IPHONE_11_0
- if (@available(iOS 10.0, *))
- #else
- if (IQ_IS_IOS10_OR_GREATER)
- #endif
- {
- [fixed setWidth:6];
- }
- else
- {
- [fixed setWidth:20];
- }
- [items addObject:fixed];
-
- //Next button
- IQBarButtonItem *next = toolbar.nextBarButton;
- if (next.isSystemItem == NO)
- {
- next.title = nil;
- next.image = imageRightArrow;
- next.target = target;
- next.action = nextAction;
- }
- else
- {
- next = [[IQBarButtonItem alloc] initWithImage:imageRightArrow style:UIBarButtonItemStylePlain target:target action:nextAction];
- next.invocation = toolbar.nextBarButton.invocation;
- next.accessibilityLabel = toolbar.nextBarButton.accessibilityLabel;
- toolbar.nextBarButton = next;
- }
- [items addObject:next];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Title button
- toolbar.titleBarButton.title = self.shouldHideToolbarPlaceholder?nil:titleText;
- #ifdef __IPHONE_11_0
- if (@available(iOS 11.0, *)) {}
- else
- #endif
- {
- toolbar.titleBarButton.customView.frame = CGRectZero;
- }
- [items addObject:toolbar.titleBarButton];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Right button
- IQBarButtonItem *doneButton = toolbar.doneBarButton;
- if (doneButton.isSystemItem == NO)
- {
- doneButton.title = nil;
- doneButton.image = rightButtonImage;
- doneButton.target = target;
- doneButton.action = rightButtonAction;
- }
- else
- {
- doneButton = [[IQBarButtonItem alloc] initWithImage:rightButtonImage style:UIBarButtonItemStyleDone target:target action:rightButtonAction];
- doneButton.invocation = toolbar.doneBarButton.invocation;
- doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel;
- toolbar.doneBarButton = doneButton;
- }
- [items addObject:doneButton];
-
- // Adding button to toolBar.
- [toolbar setItems:items];
-
- // Setting toolbar to keyboard.
- [(UITextField*)self setInputAccessoryView:toolbar];
- }
- - (void)addPreviousNextRightOnKeyboardWithTarget:(nullable id)target rightButtonImage:(nullable UIImage*)rightButtonImage previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction rightButtonAction:(nullable SEL)rightButtonAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
- {
- NSString *title = nil;
-
- if (shouldShowPlaceholder)
- title = [self drawingToolbarPlaceholder];
-
- [self addPreviousNextRightOnKeyboardWithTarget:target rightButtonImage:rightButtonImage previousAction:previousAction nextAction:nextAction rightButtonAction:rightButtonAction titleText:title];
- }
- - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NSString*)rightButtonTitle previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction titleText:(NSString*)titleText
- {
- //If can't set InputAccessoryView. Then return
- if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return;
-
- // Creating a toolBar for phoneNumber keyboard
- IQToolbar *toolbar = self.keyboardToolbar;
- if ([self respondsToSelector:@selector(keyboardAppearance)])
- {
- switch ([(UITextField*)self keyboardAppearance])
- {
- case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break;
- default: toolbar.barStyle = UIBarStyleDefault; break;
- }
- }
-
- NSMutableArray<UIBarButtonItem*> *items = [[NSMutableArray alloc] init];
-
- // Get the top level "bundle" which may actually be the framework
- NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]];
-
- // Check to see if the resource bundle exists inside the top level bundle
- NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]];
-
- if (resourcesBundle == nil) {
- resourcesBundle = mainBundle;
- }
-
- UIImage *imageLeftArrow = nil;
- UIImage *imageRightArrow = nil;
-
- #ifdef __IPHONE_11_0
- if (@available(iOS 10.0, *))
- #else
- if (IQ_IS_IOS10_OR_GREATER)
- #endif
- {
- imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowUp" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
- imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowDown" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
- }
- else
- {
- imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
- imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
- }
-
- //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
- #ifdef __IPHONE_11_0
- if (@available(iOS 9.0, *)) {
- #endif
- if ([UIImage instancesRespondToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)])
- {
- imageLeftArrow = [imageLeftArrow imageFlippedForRightToLeftLayoutDirection];
- imageRightArrow = [imageRightArrow imageFlippedForRightToLeftLayoutDirection];
- }
- #ifdef __IPHONE_11_0
- }
- #endif
-
- //Previous button
- IQBarButtonItem *prev = toolbar.previousBarButton;
- if (prev.isSystemItem == NO)
- {
- prev.title = nil;
- prev.image = imageLeftArrow;
- prev.target = target;
- prev.action = previousAction;
- }
- else
- {
- prev = [[IQBarButtonItem alloc] initWithImage:imageLeftArrow style:UIBarButtonItemStylePlain target:target action:previousAction];
- prev.invocation = toolbar.previousBarButton.invocation;
- prev.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel;
- toolbar.previousBarButton = prev;
- }
- [items addObject:prev];
-
- //Fixed space
- IQBarButtonItem *fixed = toolbar.fixedSpaceBarButton;
-
- #ifdef __IPHONE_11_0
- if (@available(iOS 10.0, *))
- #else
- if (IQ_IS_IOS10_OR_GREATER)
- #endif
- {
- [fixed setWidth:6];
- }
- else
- {
- [fixed setWidth:20];
- }
- [items addObject:fixed];
-
- //Next button
- IQBarButtonItem *next = toolbar.nextBarButton;
- if (next.isSystemItem == NO)
- {
- next.title = nil;
- next.image = imageRightArrow;
- next.target = target;
- next.action = nextAction;
- }
- else
- {
- next = [[IQBarButtonItem alloc] initWithImage:imageRightArrow style:UIBarButtonItemStylePlain target:target action:nextAction];
- next.invocation = toolbar.nextBarButton.invocation;
- next.accessibilityLabel = toolbar.nextBarButton.accessibilityLabel;
- toolbar.nextBarButton = next;
- }
- [items addObject:next];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Title button
- toolbar.titleBarButton.title = self.shouldHideToolbarPlaceholder?nil:titleText;
- #ifdef __IPHONE_11_0
- if (@available(iOS 11.0, *)) {}
- else
- #endif
- {
- toolbar.titleBarButton.customView.frame = CGRectZero;
- }
- [items addObject:toolbar.titleBarButton];
-
- //Flexible space
- [items addObject:[[self class] flexibleBarButtonItem]];
-
- //Right button
- IQBarButtonItem *doneButton = toolbar.doneBarButton;
- if (doneButton.isSystemItem == NO)
- {
- doneButton.title = rightButtonTitle;
- doneButton.image = nil;
- doneButton.target = target;
- doneButton.action = rightButtonAction;
- }
- else
- {
- doneButton =[[IQBarButtonItem alloc] initWithTitle:rightButtonTitle style:UIBarButtonItemStyleDone target:target action:rightButtonAction];
- doneButton.invocation = toolbar.doneBarButton.invocation;
- doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel;
- toolbar.doneBarButton = doneButton;
- }
- [items addObject:doneButton];
-
- // Adding button to toolBar.
- [toolbar setItems:items];
-
- // Setting toolbar to keyboard.
- [(UITextField*)self setInputAccessoryView:toolbar];
- }
- - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NSString*)rightButtonTitle previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder
- {
- NSString *title = nil;
-
- if (shouldShowPlaceholder)
- title = [self drawingToolbarPlaceholder];
-
- [self addPreviousNextRightOnKeyboardWithTarget:target rightButtonTitle:rightButtonTitle previousAction:previousAction nextAction:nextAction rightButtonAction:rightButtonAction titleText:title];
- }
- - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NSString*)rightButtonTitle previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction
- {
- [self addPreviousNextRightOnKeyboardWithTarget:target rightButtonTitle:rightButtonTitle previousAction:previousAction nextAction:nextAction rightButtonAction:rightButtonAction titleText:nil];
- }
- @end
|