From 3e8437ae559487362fae3525beb79c534c213a51 Mon Sep 17 00:00:00 2001 From: 单军华 Date: Thu, 12 Jul 2018 13:44:34 +0800 Subject: [PATCH] bug修复和功能优化 --- screendisplay/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m | 1068 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1,068 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m b/screendisplay/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m new file mode 100644 index 0000000..05108d3 --- /dev/null +++ b/screendisplay/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m @@ -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 -- Gitblit v1.8.0