键盘可以在界面上随意拖动,键盘输入

来源:互联网 发布:硬盘恢复数据公司 编辑:程序博客网 时间:2024/04/28 17:06

这个键盘可以在界面上随意拖动,有三个文件, SWKNumberKeyBoard,xib,SWKNumberKeyBoard.h ,SWKNumberKeyBoard.m



    

其中在SWKNumberKeyBoard.h文件中;


#import <UIKit/UIKit.h>


@class SWKNumberKeyBoard;


// keycode的定义

#define CUSTOM_KEY_CODE_UP 30     // ↑

#define CUSTOM_KEY_CODE_DOWN 31   // ↓

#define CUSTOM_KEY_CODE_LEFT 32   // ←

#define CUSTOM_KEY_CODE_RIGHT 33  // →

#define CUSTOM_KEY_CODE_CLOSE 50 // 关闭

#define CUSTOM_KEY_CODE_CLEAR 51  // 清除


/** 键盘操作的通知代理 */

@protocol SWKNumberKeyBoardDelegate <NSObject>

@required

/** 代理方法 */

- (void)keyboard:(SWKNumberKeyBoard *)keyboard onTouchNumber:(NSString*)number;

- (void)keyboard:(SWKNumberKeyBoard *)keyboard onTouchControl:(NSInteger)customKeyCode;

@end


@interface SWKNumberKeyBoard : UIView


// delegate

@property (weak,nonatomic) id<SWKNumberKeyBoardDelegate> delegate;


// 表示显示中的值

@property (readonly)BOOL isOpen;


//用来显示的方法

- (void)show:(UIView*)appView :(CGRect*)initStrInfo;


// 关闭方法

- (void)close;


@end



在SWKNumberKeyBoard.m方法中;


#import "SWKNumberKeyBoard.h"


// 按钮的tag的为10

static constNSInteger kCustomKeyCoad_Dot =10;   // [.]


// 默认的位置

static constNSInteger kDefaultOrigin_X =10;

static constNSInteger kDefaultOrigin_Y =300;


@interface SWKNumberKeyBoard() {

// 定义成私有的

@private

    UIView *parentView;

    UIGestureRecognizer *panGes;

}


// xib的各个控件

@property (weak,nonatomic) IBOutletUIView *keyboardView;


@property (weak,nonatomic) IBOutletUIButton *btnClose;

@property (weak,nonatomic) IBOutletUIButton *btnClear;


@property (weak,nonatomic) IBOutletUIButton *btnOne;

@property (weak,nonatomic) IBOutletUIButton *btnTwo;

@property (weak,nonatomic) IBOutletUIButton *btnThree;

@property (weak,nonatomic) IBOutletUIButton *btnFour;

@property (weak,nonatomic) IBOutletUIButton *btnFive;

@property (weak,nonatomic) IBOutletUIButton *btnSix;

@property (weak,nonatomic) IBOutletUIButton *btnSeven;

@property (weak,nonatomic) IBOutletUIButton *btnEight;

@property (weak,nonatomic) IBOutletUIButton *btnNine;

@property (weak,nonatomic) IBOutletUIButton *btnZero;

@property (weak,nonatomic) IBOutletUIButton *btnDot;


@property (weak,nonatomic) IBOutletUIButton *btnUp;

@property (weak,nonatomic) IBOutletUIButton *btnDown;

@property (weak,nonatomic) IBOutletUIButton *btnLeft;

@property (weak,nonatomic) IBOutletUIButton *btnRight;


@end


@implementation SWKNumberKeyBoard


-(instancetype)init{

    self = [superinit];

    if(self){

        // 读取 nib

        NSString *classNeme =NSStringFromClass([selfclass]);

        self = [[NSBundlemainBundle] loadNibNamed:classNemeowner:selfoptions:nil][0];

        _isOpen =NO;

    }

    returnself;

}

 //[_numKeyboard show:self.view : nil]; 在另一个控制器会将这个方法实现传入self.view,使这个键盘在控制器中显示


- (void)show:(UIView*)appView :(CGRect *)oriRect {

    

    // 移动拖动的时候UIGestureRecognizer的生成

    parentView = appView;

    panGes = [[UIPanGestureRecognizeralloc]initWithTarget:self

                                                 action:@selector(panAction:)];

    [parentViewaddGestureRecognizer:panGes];

    

    //设置键盘开始的位置

    CGRect setFrame =CGRectMake(kDefaultOrigin_X,

                                 kDefaultOrigin_Y,

                                 self.frame.size.width,

                                 self.frame.size.height);

 //如果oriRect不为空就显示当前的位置

    if (oriRect!=nil){

        setFrame.origin.x = oriRect->origin.x;

        setFrame.origin.y = oriRect->origin.y;

    }

    self.frame = setFrame;

    

    [parentViewaddSubview:self];

    // 表示键盘显示了

    _isOpen =YES;

    

}


- (void)close {

    [parentViewremoveGestureRecognizer:panGes];// UIGestureRecognizer删除   

    

    [selfremoveFromSuperview];

// 表示键盘不显示

    _isOpen =NO;

}

// 只包含各个数字的键盘按钮

- (IBAction)onTouchNumber:(UIButton *)sender {

    // 按钮的tag

    NSString *ret = [NSStringstringWithFormat:@"%ld", (long)sender.tag];

    

    // [.]键的情况下,将tag为10的键盘按钮换为 .

    if ([retisEqualToString:[NSStringstringWithFormat:@"%ld", (long)kCustomKeyCoad_Dot]]) ret = @".";

    

    // 实现代理方法

    [self.delegatekeyboard:selfonTouchNumber:ret];

}

//上下左右,清除,关闭的按钮的点击事件

- (IBAction)onTouchControl:(UIButton *)sender {

    // 实现代理方法

    [self.delegatekeyboard:selfonTouchControl:sender.tag];

}


/** 拖动的时候会调用这个方法 */

- (void) panAction:(UIPanGestureRecognizer *)pan {

    // 得到移动的距离

    CGPoint point = [pantranslationInView:parentView];

    

    // 加上移动的距离,使键盘得到现在的位置

    CGPoint movedPoint =CGPointMake(self.center.x + point.x,

                                     self.center.y + point.y);

    self.center = movedPoint;

    

    // 移动后的距离进行初始化,不这样做的话,

     // [pan translationInView:]返回的距离会一直加上去。

    [pan setTranslation:CGPointZero

                 inView:parentView];

}


@end



////////////////////////////////////////////////////////////////////////////////////


在另一个控制器中实现上面的代理方法


/** 找到输入的对象 */


- (UIView *)findFirstResponder:(UIView *)view

{

    if (view.isFirstResponder) {

        return view;

    }

    

    for (UIView *subViewin view.subviews) {

        

        if ([subViewisFirstResponder]) {

            return subView;

        }

        

        UIView *responder = [selffindFirstResponder:subView];

        if (responder) {

            return responder;

        }

    }

    

    returnnil;

}


/** 关闭键盘 */

- (void)closeNumberKeybord {

    // 关闭键盘,close是SWKViewController里面的一个方法

    [_numKeyboardclose];

    // 其他的,无须关心

    [self.viewremoveGestureRecognizer:_singleTap];

    

    [self.viewendEditing:YES];

}


/** 像右移动 */

- (void)moveToNextResponder

{

    if (self.numberOfNewTF.isFirstResponder)

    {

        [self.numberOfMorningTFbecomeFirstResponder];

    }

    elseif (self.numberOfMorningTF.isFirstResponder)

    {

        [self.numberOfPlanTFbecomeFirstResponder];

    }

    elseif (self.numberOfPlanTF.isFirstResponder)

    {

        [self.numberOfResultTFbecomeFirstResponder];

    }

}


/** 像左移动 ,numberOfNewTF等都是相应的textField */

- (void)moveToPreviousResponder

{

    if (self.numberOfMorningTF.isFirstResponder)

    {

        [self.numberOfNewTFbecomeFirstResponder];

    }

    elseif (self.numberOfPlanTF.isFirstResponder)

    {

        [self.numberOfMorningTFbecomeFirstResponder];

    }

    elseif (self.numberOfResultTF.isFirstResponder)

    {

        [self.numberOfPlanTFbecomeFirstResponder];

    }

}



/** ([0][9][.])的点击事件用的方法 */

- (void)keyboard:(SWKNumberKeyBoard *)keyboard onTouchNumber:(NSString*)number

{

    //找到输入的地方

    UIView *firstResponder = [selffindFirstResponder:self.view];

    if ((firstResponder)

        && ([firstResponder isKindOfClass:[UITextFieldclass]]))

    {

        // 插入数据

        [(UITextField *)firstResponderinsertText:number];

    }

}


/** ([关闭][清除]と方向键)的点击事件用的方法 */

- (void)keyboard:(SWKNumberKeyBoard *)keyboard onTouchControl:(NSInteger)customKeyCode{

    if (customKeyCode ==CUSTOM_KEY_CODE_CLOSE)

    {

        [selfcloseNumberKeybord];

    }

    else if (customKeyCode == CUSTOM_KEY_CODE_CLEAR)

    {

        UIView *firstResponder = [selffindFirstResponder:self.view];

        if ((firstResponder)

            && ([firstResponder isKindOfClass:[UITextFieldclass]]))

        {

            ((UITextField *)firstResponder).text =@"";

        }

    }

    else

    {

        //输入的对象移动了

        UIView *firstResponder = [selffindFirstResponder:self.view];

        if (firstResponder)

        {

            // 下一个

            UIResponder *responder = firstResponder.nextResponder;

            while (responder) {

                if ([responderisEqual:self])

                {

                    if (customKeyCode ==CUSTOM_KEY_CODE_LEFT)

                    {

                        [selfmoveToPreviousResponder];

                    }

                    elseif (customKeyCode == CUSTOM_KEY_CODE_RIGHT)

                    {

                        [selfmoveToNextResponder];

                    }

               

                    break;

                }

                elseif ([responder isKindOfClass:[SWKTableViewCellclass]])

                {

                    SWKTableViewCell *cell = (SWKTableViewCell *)responder;

                    switch (customKeyCode) {

                        caseCUSTOM_KEY_CODE_UP:

                            //

                            [cell moveToUpperCell:firstResponder];

                            break;

                        caseCUSTOM_KEY_CODE_DOWN:

                            //

                            [cell moveToDownerCell:firstResponder];

                            break;

                        caseCUSTOM_KEY_CODE_LEFT:

                            //

                            [cell moveToPreviousResponder];

                            break;

                        caseCUSTOM_KEY_CODE_RIGHT:

                            //

                            [cell moveToNextResponder];

                            break;

                        default:

                            break;

                    }

                    break;

                }

                    // 这部分的好像没用到

                elseif ([responder isKindOfClass:[SWKSubViewControllerclass]])

                {

                    SWKSubViewController *subVC = (SWKSubViewController *)responder;

                    // 

                    if (customKeyCode ==CUSTOM_KEY_CODE_LEFT)

                    {

                        [subVC moveToPreviousResponder];

                    }

                    elseif (customKeyCode == CUSTOM_KEY_CODE_RIGHT)

                    {

                        [subVC moveToNextResponder];

                    }

                    break;

                }

                responder = responder.nextResponder;

            }

        }

    }

}



                    // 上面的只要是SWKTableViewCell的类型,都会掉用里面的代理方法
SWKTableViewCell.h的内容如下;

#import <UIKit/UIKit.h>

#import "SWKCellViewModel.h"



@protocol SWKCellDelegate<NSObject>


@optional

/** 向上的移动 */

- (void) cell:(UITableViewCell *)cell onMoveToUpper:(UIView *)currentResponder;

/**  */

- (void) cell:(UITableViewCell *)cell onMoveToDowner:(UIView *)currentResponder;


@end


@interface SWKTableViewCell : UITableViewCell


/** SWKCellDelegate */

@property (nonatomic,weak) id<SWKCellDelegate> delegate;


/** ViewModel */

@property (nonatomic)SWKCellViewModel *viewModel;



- (void)moveToNextResponder;


- (void)moveToPreviousResponder;


- (void)moveFromOtherCell:(UIView *)currentResponder;



- (void)moveToUpperCell:(UIView *)currentResponder;


- (void)moveToDownerCell:(UIView *)currentResponder;


@end



SWKTableViewCell.m的文件内容为下;




#import "SWKTableViewCell.h"


@implementation SWKTableViewCell


- (void)awakeFromNib {

    [superawakeFromNib];

    // Initialization code

}


- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

    [supersetSelected:selected animated:animated];


    // Configure the view for the selected state

}


- (void)moveToNextResponder

{

   

}


- (void)moveToPreviousResponder

{

   

}


- (void)moveFromOtherCell:(UIView *)currentResponder

{

  

}



- (void)moveToUpperCell:(UIView *)currentResponder

{

    if ((self.delegate)

        && ([self.delegaterespondsToSelector:@selector(cell:onMoveToUpper:)]))

    {

        [self.delegatecell:selfonMoveToUpper:currentResponder];

    }

}


- (void)moveToDownerCell:(UIView *)currentResponder

{

    if ((self.delegate)

        && ([self.delegaterespondsToSelector:@selector(cell:onMoveToDowner:)]))

    {

        [self.delegatecell:selfonMoveToDowner:currentResponder];

    }

}


@end



////////////////////////////////////////////////


- (void)moveToTargetCellAsync:(UIView *)currentResponder targetPath:(NSIndexPath *)targetPath

{

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{


        UITableViewCell *blockCell =nil;

        int cnt =0;

        while (blockCell ==nil)

        {

            blockCell = [self.tableViewcellForRowAtIndexPath:targetPath];

            cnt++;

            if (cnt >10)

            {

         

                break;

            }

            usleep(50000);

        }

        if (blockCell)

        {

            dispatch_async(dispatch_get_main_queue(), ^{

                [((SWKTableViewCell *)blockCell)moveFromOtherCell:currentResponder];

            });

        }

    });

}



//////////////////////////////////


/** 从别的cell移动到当前cell的情况 */

- (void)moveFromOtherCell:(UIView *)currentResponder

{


    if ([_numberOfNewTF_CL.accessibilityIdentifierisEqualToString:currentResponder.accessibilityIdentifier])

    {

        [_numberOfNewTF_CLbecomeFirstResponder];

    }

    elseif ([_numberOfMorningTF_CL.accessibilityIdentifierisEqualToString:currentResponder.accessibilityIdentifier])

    {

        [_numberOfMorningTF_CLbecomeFirstResponder];

    }

    elseif ([_numberOfPlansHourTF_CL.accessibilityIdentifierisEqualToString:currentResponder.accessibilityIdentifier])

    {

        [_numberOfPlansHourTF_CLbecomeFirstResponder];

    }

    elseif ([_numberOfResultsHourTF_CL.accessibilityIdentifierisEqualToString:currentResponder.accessibilityIdentifier])

    {

        [_numberOfResultsHourTF_CLbecomeFirstResponder];

    }

    elseif ([_numberOfPlansTF_CL.accessibilityIdentifierisEqualToString:currentResponder.accessibilityIdentifier])

    {

        [_numberOfPlansTF_CLbecomeFirstResponder];

    }

    elseif ([_numberOfResultsTF_CL.accessibilityIdentifierisEqualToString:currentResponder.accessibilityIdentifier])

    {

        [_numberOfResultsTF_CLbecomeFirstResponder];

    }

}



0 0
原创粉丝点击