// // 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 #import #import #import /*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 *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 *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 *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 *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 *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 *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 *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 *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