单军华
2018-07-19 83b9d5c682b21d88133f24da0f94dd56bd79e687
screendisplay/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m
New file
@@ -0,0 +1,1068 @@
//
// 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