Files
IQKeyboardManager/IQKeyBoardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m
2015-04-03 00:19:51 +05:30

723 lines
30 KiB
Objective-C

//
// UIView+IQToolbar.m
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-14 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 "IQSegmentedNextPrevious.h"
#import "IQToolbar.h"
#import "IQTitleBarButtonItem.h"
#import "IQKeyboardManagerConstantsInternal.h"
#import "IQBarButtonItem.h"
#import "IQKeyboardManager.h"
#import <UIKit/UIImage.h>
#import <UIKit/UILabel.h>
#import <objc/runtime.h>
/*UIKeyboardToolbar Category implementation*/
@implementation UIView (IQToolbarAddition)
-(void)setShouldHideTitle:(BOOL)shouldHideTitle
{
objc_setAssociatedObject(self, @selector(shouldHideTitle), @(shouldHideTitle), OBJC_ASSOCIATION_ASSIGN);
}
-(BOOL)shouldHideTitle
{
NSNumber *shouldHideTitle = objc_getAssociatedObject(self, @selector(shouldHideTitle));
return [shouldHideTitle boolValue];
}
-(void)setCustomPreviousTarget:(id)target action:(SEL)action
{
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[target methodSignatureForSelector:action]];
invocation.target = target;
invocation.selector = action;
UIView *selfObject = self;
[invocation setArgument:&selfObject atIndex:2];
self.previousInvocation = invocation;
}
-(void)setCustomNextTarget:(id)target action:(SEL)action
{
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[target methodSignatureForSelector:action]];
invocation.target = target;
invocation.selector = action;
UIView *selfObject = self;
[invocation setArgument:&selfObject atIndex:2];
self.nextInvocation = invocation;
}
-(void)setCustomDoneTarget:(id)target action:(SEL)action
{
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[target methodSignatureForSelector:action]];
invocation.target = target;
invocation.selector = action;
UIView *selfObject = self;
[invocation setArgument:&selfObject atIndex:2];
self.doneInvocation = invocation;
}
-(void)setPreviousInvocation:(NSInvocation *)previousInvocation
{
objc_setAssociatedObject(self, @selector(previousInvocation), previousInvocation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(void)setNextInvocation:(NSInvocation *)nextInvocation
{
objc_setAssociatedObject(self, @selector(nextInvocation), nextInvocation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(void)setDoneInvocation:(NSInvocation *)doneInvocation
{
objc_setAssociatedObject(self, @selector(doneInvocation), doneInvocation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSInvocation *)previousInvocation
{
return objc_getAssociatedObject(self, @selector(previousInvocation));
}
-(NSInvocation *)nextInvocation
{
return objc_getAssociatedObject(self, @selector(nextInvocation));
}
-(NSInvocation *)doneInvocation
{
return objc_getAssociatedObject(self, @selector(doneInvocation));
}
- (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 = [[IQToolbar alloc] init];
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];
if ([titleText length] && self.shouldHideTitle == NO)
{
CGRect buttonFrame;
if (IQ_IS_IOS7_OR_GREATER)
{
/*
50 done button frame.
24 distance maintenance
*/
buttonFrame = CGRectMake(0, 0, toolbar.frame.size.width-50.0-24, 44);
}
else
{
/*
57 done button frame.
8 distance maintenance
*/
buttonFrame = CGRectMake(0, 0, toolbar.frame.size.width-57.0-8, 44);
}
IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithFrame:buttonFrame title:titleText];
[items addObject:title];
}
// Create a fake button to maintain flexibleSpace between doneButton and nilButton. (Actually it moves done button to right side.
IQBarButtonItem *nilButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:nilButton];
// Create a done button to show on keyboard to resign it. Adding a selector to resign it.
IQBarButtonItem *doneButton =[[IQBarButtonItem alloc] initWithTitle:text style:UIBarButtonItemStyleDone target:target action:action];
[items addObject:doneButton];
// Adding button to toolBar.
[toolbar setItems:items];
// Setting toolbar to textFieldPhoneNumber keyboard.
[(UITextField*)self setInputAccessoryView:toolbar];
}
- (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)showPlaceholder
{
NSString *title;
if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder];
[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 = [[IQToolbar alloc] init];
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];
if ([titleText length] && self.shouldHideTitle == NO)
{
CGRect buttonFrame;
if (IQ_IS_IOS7_OR_GREATER)
{
/*
50 done button frame.
8 distance maintenance
*/
buttonFrame = CGRectMake(0, 0, toolbar.frame.size.width-64.0-12.0, 44);
}
else
{
/*
57 done button frame.
8 distance maintenance
*/
buttonFrame = CGRectMake(0, 0, toolbar.frame.size.width-57.0-8, 44);
}
IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithFrame:buttonFrame title:titleText];
[items addObject:title];
}
// Create a fake button to maintain flexibleSpace between doneButton and nilButton. (Actually it moves done button to right side.
IQBarButtonItem *nilButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:nilButton];
// Create a done button to show on keyboard to resign it. Adding a selector to resign it.
IQBarButtonItem *doneButton = [[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:target action:action];
[items addObject:doneButton];
// Adding button to toolBar.
[toolbar setItems:items];
// Setting toolbar to textFieldPhoneNumber keyboard.
[(UITextField*)self setInputAccessoryView:toolbar];
}
#pragma mark - Toolbar on UIKeyboard
-(void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)showPlaceholder
{
NSString *title;
if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder];
[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 = [[IQToolbar alloc] init];
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];
// Create a cancel button to show on keyboard to resign it. Adding a selector to resign it.
IQBarButtonItem *cancelButton =[[IQBarButtonItem alloc] initWithTitle:leftTitle style:UIBarButtonItemStylePlain target:target action:leftAction];
[items addObject:cancelButton];
if ([titleText length] && self.shouldHideTitle == NO)
{
CGRect buttonFrame;
if (IQ_IS_IOS7_OR_GREATER)
{
/*
66 Cancel button maximum x.
50 done button frame.
8+8 distance maintenance
*/
buttonFrame = CGRectMake(0, 0, toolbar.frame.size.width-66-50.0-16, 44);
}
else
{
/*
66 Cancel button maximum x.
57 done button frame.
8+8 distance maintenance
*/
buttonFrame = CGRectMake(0, 0, toolbar.frame.size.width-66-57.0-16, 44);
}
IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithFrame:buttonFrame title:titleText];
[items addObject:title];
}
// Create a fake button to maintain flexibleSpace between doneButton and nilButton. (Actually it moves done button to right side.
IQBarButtonItem *nilButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:nilButton];
// Create a done button to show on keyboard to resign it. Adding a selector to resign it.
IQBarButtonItem *doneButton =[[IQBarButtonItem alloc] initWithTitle:rightTitle style:UIBarButtonItemStylePlain target:target action:rightAction];
[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)showPlaceholder
{
NSString *title;
if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder];
[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 = [[IQToolbar alloc] init];
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];
// Create a cancel button to show on keyboard to resign it. Adding a selector to resign it.
IQBarButtonItem *cancelButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:target action:cancelAction];
[items addObject:cancelButton];
if ([titleText length] && self.shouldHideTitle == NO)
{
CGRect buttonFrame;
if (IQ_IS_IOS7_OR_GREATER)
{
/*
66 Cancel button maximum x.
50 done button frame.
8+8 distance maintenance
*/
buttonFrame = CGRectMake(0, 0, toolbar.frame.size.width-66-50.0-16, 44);
}
else
{
/*
66 Cancel button maximum x.
57 done button frame.
8+8 distance maintenance
*/
buttonFrame = CGRectMake(0, 0, toolbar.frame.size.width-66-57.0-16, 44);
}
IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithFrame:buttonFrame title:titleText];
[items addObject:title];
}
// Create a fake button to maintain flexibleSpace between doneButton and nilButton. (Actually it moves done button to right side.
IQBarButtonItem *nilButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:nilButton];
// Create a done button to show on keyboard to resign it. Adding a selector to resign it.
IQBarButtonItem *doneButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:target 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)showPlaceholder
{
NSString *title;
if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder];
[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 = [[IQToolbar alloc] init];
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];
// Create a done button to show on keyboard to resign it. Adding a selector to resign it.
IQBarButtonItem *doneButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:target action:doneAction];
if (IQ_IS_IOS7_OR_GREATER)
{
// UIBarButtonItem *prev = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:105 target:target action:previousAction];
// UIBarButtonItem *next = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:106 target:target action:nextAction];
UIImage *imageLeftArrow;
UIImage *imageRightArrow;
//Xcode Compilation check
#if IQ_IS_XCODE_6_0_OR_GREATER
if (IQ_IS_IOS8_OR_GREATER)
{
// 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;
}
imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
}
else
#endif
{
imageLeftArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowLeft"];
imageRightArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowRight"];
}
IQBarButtonItem *prev = [[IQBarButtonItem alloc] initWithImage:imageLeftArrow style:UIBarButtonItemStylePlain target:target action:previousAction];
IQBarButtonItem *fixed =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
[fixed setWidth:23];
IQBarButtonItem *next = [[IQBarButtonItem alloc] initWithImage:imageRightArrow style:UIBarButtonItemStylePlain target:target action:nextAction];
[items addObject:prev];
[items addObject:fixed];
[items addObject:next];
}
else
{
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
// Create a next/previous button to switch between TextFieldViews.
IQSegmentedNextPrevious *segControl = [[IQSegmentedNextPrevious alloc] initWithTarget:target previousAction:previousAction nextAction:nextAction];
#pragma GCC diagnostic pop
IQBarButtonItem *segButton = [[IQBarButtonItem alloc] initWithCustomView:segControl];
[items addObject:segButton];
}
if ([titleText length] && self.shouldHideTitle == NO)
{
CGRect buttonFrame;
if (IQ_IS_IOS7_OR_GREATER)
{
/*
72.5 next/previous maximum x.
50 done button frame.
8+8 distance maintenance
*/
buttonFrame = CGRectMake(0, 0, toolbar.frame.size.width-72.5-50.0-16, 44);
}
else
{
/*
135 next/previous maximum x.
57 done button frame.
8+8 distance maintenance
*/
buttonFrame = CGRectMake(0, 0, toolbar.frame.size.width-135-57.0-16, 44);
}
IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithFrame:buttonFrame title:titleText];
[items addObject:title];
}
IQBarButtonItem *nilButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:nilButton];
[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)showPlaceholder
{
NSString *title;
if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder];
[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 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 = [[IQToolbar alloc] init];
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];
// Create a done button to show on keyboard to resign it. Adding a selector to resign it.
IQBarButtonItem *doneButton =[[IQBarButtonItem alloc] initWithTitle:titleText style:UIBarButtonItemStyleDone target:target action:rightButtonAction];
if (IQ_IS_IOS7_OR_GREATER)
{
// UIBarButtonItem *prev = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:105 target:target action:previousAction];
// UIBarButtonItem *next = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:106 target:target action:nextAction];
UIImage *imageLeftArrow;
UIImage *imageRightArrow;
//Xcode Compilation check
#if IQ_IS_XCODE_6_0_OR_GREATER
if (IQ_IS_IOS8_OR_GREATER)
{
// 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;
}
imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil];
}
else
#endif
{
imageLeftArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowLeft"];
imageRightArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowRight"];
}
IQBarButtonItem *prev = [[IQBarButtonItem alloc] initWithImage:imageLeftArrow style:UIBarButtonItemStylePlain target:target action:previousAction];
IQBarButtonItem *fixed =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
[fixed setWidth:23];
IQBarButtonItem *next = [[IQBarButtonItem alloc] initWithImage:imageRightArrow style:UIBarButtonItemStylePlain target:target action:nextAction];
[items addObject:prev];
[items addObject:fixed];
[items addObject:next];
}
else
{
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
// Create a next/previous button to switch between TextFieldViews.
IQSegmentedNextPrevious *segControl = [[IQSegmentedNextPrevious alloc] initWithTarget:target previousAction:previousAction nextAction:nextAction];
#pragma GCC diagnostic pop
IQBarButtonItem *segButton = [[IQBarButtonItem alloc] initWithCustomView:segControl];
[items addObject:segButton];
}
if ([titleText length] && self.shouldHideTitle == NO)
{
CGRect buttonFrame;
if (IQ_IS_IOS7_OR_GREATER)
{
/*
72.5 next/previous maximum x.
50 done button frame.
8+8 distance maintenance
*/
buttonFrame = CGRectMake(0, 0, toolbar.frame.size.width-72.5-50.0-16, 44);
}
else
{
/*
135 next/previous maximum x.
57 done button frame.
8+8 distance maintenance
*/
buttonFrame = CGRectMake(0, 0, toolbar.frame.size.width-135-57.0-16, 44);
}
IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithFrame:buttonFrame title:titleText];
[items addObject:title];
}
IQBarButtonItem *nilButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:nilButton];
[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)showPlaceholder
{
NSString *title;
if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder];
[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];
}
-(void)setEnablePrevious:(BOOL)isPreviousEnabled next:(BOOL)isNextEnabled
{
// Getting inputAccessoryView.
IQToolbar *inputAccessoryView = (IQToolbar*)[self inputAccessoryView];
// If it is IQToolbar and it's items are greater than zero.
if ([inputAccessoryView isKindOfClass:[IQToolbar class]] && [[inputAccessoryView items] count]>0)
{
if (IQ_IS_IOS7_OR_GREATER && [[inputAccessoryView items] count]>3)
{
// Getting first item from inputAccessoryView.
IQBarButtonItem *prevButton = (IQBarButtonItem*)[inputAccessoryView items][0];
IQBarButtonItem *nextButton = (IQBarButtonItem*)[inputAccessoryView items][2];
// If it is UIBarButtonItem and it's customView is not nil.
if ([prevButton isKindOfClass:[IQBarButtonItem class]] && [nextButton isKindOfClass:[IQBarButtonItem class]])
{
if (prevButton.enabled != isPreviousEnabled)
[prevButton setEnabled:isPreviousEnabled];
if (nextButton.enabled != isNextEnabled)
[nextButton setEnabled:isNextEnabled];
}
}
else
{
// Getting first item from inputAccessoryView.
IQBarButtonItem *barButtonItem = (IQBarButtonItem*)[inputAccessoryView items][0];
// If it is IQBarButtonItem and it's customView is not nil.
if ([barButtonItem isKindOfClass:[IQBarButtonItem class]] && [barButtonItem customView] != nil)
{
// Getting it's customView.
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
IQSegmentedNextPrevious *segmentedControl = (IQSegmentedNextPrevious*)[barButtonItem customView];
// If its customView is IQSegmentedNextPrevious and has 2 segments
if ([segmentedControl isKindOfClass:[IQSegmentedNextPrevious class]] && [segmentedControl numberOfSegments]==2)
#pragma GCC diagnostic pop
{
if ([segmentedControl isEnabledForSegmentAtIndex:0] != isPreviousEnabled)
{
// Setting it's first segment enable/disable.
[segmentedControl setEnabled:isPreviousEnabled forSegmentAtIndex:0];
}
if ([segmentedControl isEnabledForSegmentAtIndex:1] != isNextEnabled)
{
// Setting it's second segment enable/disable.
[segmentedControl setEnabled:isNextEnabled forSegmentAtIndex:1];
}
}
}
}
}
}
@end