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

这个键盘可以在界面上随意拖动,有三个文件, 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 const NSInteger kCustomKeyCoad_Dot = 10;   // [.]


// 默认的位置

static const NSInteger kDefaultOrigin_X = 10;

static const NSInteger kDefaultOrigin_Y = 300;


@interface SWKNumberKeyBoard() {

// 定义成私有的

@private

    UIView *parentView;

    UIGestureRecognizer *panGes;

}


// xib的各个控件

@property (weak, nonatomic) IBOutlet UIView *keyboardView;


@property (weak, nonatomic) IBOutlet UIButton *btnClose;

@property (weak, nonatomic) IBOutlet UIButton *btnClear;


@property (weak, nonatomic) IBOutlet UIButton *btnOne;

@property (weak, nonatomic) IBOutlet UIButton *btnTwo;

@property (weak, nonatomic) IBOutlet UIButton *btnThree;

@property (weak, nonatomic) IBOutlet UIButton *btnFour;

@property (weak, nonatomic) IBOutlet UIButton *btnFive;

@property (weak, nonatomic) IBOutlet UIButton *btnSix;

@property (weak, nonatomic) IBOutlet UIButton *btnSeven;

@property (weak, nonatomic) IBOutlet UIButton *btnEight;

@property (weak, nonatomic) IBOutlet UIButton *btnNine;

@property (weak, nonatomic) IBOutlet UIButton *btnZero;

@property (weak, nonatomic) IBOutlet UIButton *btnDot;


@property (weak, nonatomic) IBOutlet UIButton *btnUp;

@property (weak, nonatomic) IBOutlet UIButton *btnDown;

@property (weak, nonatomic) IBOutlet UIButton *btnLeft;

@property (weak, nonatomic) IBOutlet UIButton *btnRight;


@end


@implementation SWKNumberKeyBoard


-(instancetype)init{

    self = [super init];

    if(self){

        // 读取 nib

        NSString *classNeme = NSStringFromClass([self class]);

        self = [[NSBundle mainBundle] loadNibNamed:classNeme owner:self options:nil][0];

        _isOpen = NO;

    }

    return self;

}

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


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

    

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

    parentView = appView;

    panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self

                                                 action:@selector(panAction:)];

    [parentView addGestureRecognizer: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;

    

    [parentView addSubview:self];

    // 表示键盘显示了

    _isOpen = YES;

    

}


- (void)close {

    [parentView removeGestureRecognizer:panGes]; // UIGestureRecognizer删除   

    

    [self removeFromSuperview];

// 表示键盘不显示

    _isOpen = NO;

}

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

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

    // 按钮的tag

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

    

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

    if ([ret isEqualToString:[NSString stringWithFormat:@"%ld", (long)kCustomKeyCoad_Dot]]) ret = @".";

    

    // 实现代理方法

    [self.delegate keyboard:self onTouchNumber:ret];

}

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

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

    // 实现代理方法

    [self.delegate keyboard:self onTouchControl:sender.tag];

}


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

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

    // 得到移动的距离

    CGPoint point = [pan translationInView: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 *subView in view.subviews) {

        

        if ([subView isFirstResponder]) {

            return subView;

        }

        

        UIView *responder = [self findFirstResponder:subView];

        if (responder) {

            return responder;

        }

    }

    

    return nil;

}


/** 关闭键盘 */

- (void)closeNumberKeybord {

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

    [_numKeyboard close];

    // 其他的,无须关心

    [self.view removeGestureRecognizer:_singleTap];

    

    [self.view endEditing:YES];

}


/** 像右移动 */

- (void)moveToNextResponder

{

    if (self.numberOfNewTF.isFirstResponder)

    {

        [self.numberOfMorningTF becomeFirstResponder];

    }

    else if (self.numberOfMorningTF.isFirstResponder)

    {

        [self.numberOfPlanTF becomeFirstResponder];

    }

    else if (self.numberOfPlanTF.isFirstResponder)

    {

        [self.numberOfResultTF becomeFirstResponder];

    }

}


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

- (void)moveToPreviousResponder

{

    if (self.numberOfMorningTF.isFirstResponder)

    {

        [self.numberOfNewTF becomeFirstResponder];

    }

    else if (self.numberOfPlanTF.isFirstResponder)

    {

        [self.numberOfMorningTF becomeFirstResponder];

    }

    else if (self.numberOfResultTF.isFirstResponder)

    {

        [self.numberOfPlanTF becomeFirstResponder];

    }

}



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

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

{

    // 找到输入的地方

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

    if ((firstResponder)

        && ([firstResponder isKindOfClass:[UITextField class]]))

    {

        // 插入数据

        [(UITextField *)firstResponder insertText:number];

    }

}


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

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

    if (customKeyCode == CUSTOM_KEY_CODE_CLOSE)

    {

        [self closeNumberKeybord];

    }

    else if (customKeyCode == CUSTOM_KEY_CODE_CLEAR)

    {

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

        if ((firstResponder)

            && ([firstResponder isKindOfClass:[UITextField class]]))

        {

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

        }

    }

    else

    {

        // 输入的对象移动了

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

        if (firstResponder)

        {

            // 下一个

            UIResponder *responder = firstResponder.nextResponder;

            while (responder) {

                if ([responder isEqual:self])

                {

                    if (customKeyCode == CUSTOM_KEY_CODE_LEFT)

                    {

                        [self moveToPreviousResponder];

                    }

                    else if (customKeyCode == CUSTOM_KEY_CODE_RIGHT)

                    {

                        [self moveToNextResponder];

                    }

               

                    break;

                }

                else if ([responder isKindOfClass:[SWKTableViewCell class]])

                {

                    SWKTableViewCell *cell = (SWKTableViewCell *)responder;

                    switch (customKeyCode) {

                        case CUSTOM_KEY_CODE_UP:

                            //

                            [cell moveToUpperCell:firstResponder];

                            break;

                        case CUSTOM_KEY_CODE_DOWN:

                            //

                            [cell moveToDownerCell:firstResponder];

                            break;

                        case CUSTOM_KEY_CODE_LEFT:

                            //

                            [cell moveToPreviousResponder];

                            break;

                        case CUSTOM_KEY_CODE_RIGHT:

                            //

                            [cell moveToNextResponder];

                            break;

                        default:

                            break;

                    }

                    break;

                }

                    // 这部分的好像没用到

                else if ([responder isKindOfClass:[SWKSubViewController class]])

                {

                    SWKSubViewController *subVC = (SWKSubViewController *)responder;

                    // 

                    if (customKeyCode == CUSTOM_KEY_CODE_LEFT)

                    {

                        [subVC moveToPreviousResponder];

                    }

                    else if (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 {

    [super awakeFromNib];

    // Initialization code

}


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

    [super setSelected: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.delegate respondsToSelector:@selector(cell:onMoveToUpper:)]))

    {

        [self.delegate cell:self onMoveToUpper:currentResponder];

    }

}


- (void)moveToDownerCell:(UIView *)currentResponder

{

    if ((self.delegate)

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

    {

        [self.delegate cell:self onMoveToDowner: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.tableView cellForRowAtIndexPath: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.accessibilityIdentifier isEqualToString:currentResponder.accessibilityIdentifier])

    {

        [_numberOfNewTF_CL becomeFirstResponder];

    }

    else if ([_numberOfMorningTF_CL.accessibilityIdentifier isEqualToString:currentResponder.accessibilityIdentifier])

    {

        [_numberOfMorningTF_CL becomeFirstResponder];

    }

    else if ([_numberOfPlansHourTF_CL.accessibilityIdentifier isEqualToString:currentResponder.accessibilityIdentifier])

    {

        [_numberOfPlansHourTF_CL becomeFirstResponder];

    }

    else if ([_numberOfResultsHourTF_CL.accessibilityIdentifier isEqualToString:currentResponder.accessibilityIdentifier])

    {

        [_numberOfResultsHourTF_CL becomeFirstResponder];

    }

    else if ([_numberOfPlansTF_CL.accessibilityIdentifier isEqualToString:currentResponder.accessibilityIdentifier])

    {

        [_numberOfPlansTF_CL becomeFirstResponder];

    }

    else if ([_numberOfResultsTF_CL.accessibilityIdentifier isEqualToString:currentResponder.accessibilityIdentifier])

    {

        [_numberOfResultsTF_CL becomeFirstResponder];

    }

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在LabVIEW中获取键盘输入值有多种方法。以下是两种常用的方法: 1. 使用键盘事件结构: 首先,将键盘事件结构拖放到LabVIEW的Block Diagram中。右键单击该结构,选择"Add Case",然后选择所需的按键事件类型,如按下、松开或保持按住。在每个案例中,将希望执行的代码放入结构内。例如,在"Key Down"案例中,插入一个用户界面元素,如仪表或指示灯,以显示键盘输入。 2. 使用控件的键盘事件: 在LabVIEW的用户界面(Front Panel)中,选择想要接受键盘输入的控件(如数值输入框)。找到该控件的属性面板(Property Node),展开"Event"选项,选择"Key Down"或其他需要的事件类型。选择事件后,将会生成与该事件相关的VI图标,通过连接到该图标,就可以在该事件发生时执行相应的代码。 无论使用哪种方法,都可以通过判断输入的按键的键码(Keycode)或字符来执行不同的操作。可以通过查找键码表或字符表来查找相应的键码或字符。 ### 回答2: 在LabVIEW中获取键盘输入值可以通过以下步骤实现: 1. 打开LabVIEW软件并创建一个新的VI(虚拟设备接口)。 2. 在Front Panel(前面板)上选择Controls(控件)选项卡,然后从Palette(工具箱)中选择String & Control(字符串和控件)工具来创建一个文本输入框控件。 3. 将文本输入框拖放到Front Panel上的适当位置,并调整大小以适应需要。 4. 在Block Diagram(块图)上右键单击,选择Structures(结构)选项卡,然后选择Event Structures(事件结构)工具。 5. 在Block Diagram上单击鼠标左键,然后在Event Structures上创建一个事件结构框。 6. 在Front Panel上选中文本输入框控件,然后将其拖放到事件结构框中。 7. 右键单击事件结构框,选择Add Event Case(添加事件案例)。 8. 在Event structure case(事件结构案例)上单击鼠标右键,选择Keyboard(键盘)选项。 9. 在该事件案例下,您可以使用控件上的Value(值)属性节点来获取键盘输入的值,并将其连接到需要使用的其他部分。 10. 运行该VI时,在文本输入框内键入内容,并按下Enter键或Tab键,LabVIEW将获取键盘输入的值并将其传递给后续处理。 以上是在LabVIEW中获取键盘输入值的简要步骤。这样,您可以方便地获取用户从键盘输入的信息,并在LabVIEW中进行相应的处理和应用。 ### 回答3: 在LabVIEW中,你可以使用"键盘输入"函数来获取键盘输入的值。 首先,打开LabVIEW并创建一个新的VI。在Block Diagram页面上,右击面板上的空白区域,选择"函数",然后在弹出的菜单中选择"输入和输出"。 在"输入和输出"菜单中,选择"键盘输入"函数。然后,将其拖动到面板上。 接下来,你需要将"键盘输入"函数与一个指示灯(Indicator)或其他要接收输入值的控制件(Control)连接起来。右击空白区域,选择"函数",然后选择"Boolean"以创建一个布尔指示灯。 将布尔指示灯拖动到面板上,并用鼠标右键单击"键盘输入"函数的输出端口。选择"添加指示灯"来将指示灯与"键盘输入"函数连接起来。 现在,当你运行LabVIEW VI时,你可以在面板上按下键盘上的任意键来接收输入值。按下的键会在布尔指示灯上显示为true。 你可以将"键盘输入"函数与其他功能块结合使用,例如布尔逻辑运算或数值计算等,以处理键盘输入的值。 最后,保存并运行你的LabVIEW VI程序,通过按下键盘上的键盘来获取输入值。 这就是使用LabVIEW获取键盘输入值的基本方法。你可以根据需要进一步扩展和修改该程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值