键盘可以在界面上随意拖动,键盘输入
来源:互联网 发布:硬盘恢复数据公司 编辑:程序博客网 时间: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;
}
}
}
}
#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
#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];
}
}
- 键盘可以在界面上随意拖动,键盘输入
- 各个栏目可以在网页上随意拖动
- 可在屏幕上随意拖动的控件
- [.Net码农].NET运行界面上,实现随意拖动控件的方法
- 大神们有知道图片上怎么添加多个可以随意拖动的标记吗?
- 怎样使得一个层可以随意拖动?
- 图片随意移动,可以拖动图片
- 监听键盘是否在界面上
- 如何在word2007插入图片随意拖动
- 随意拖动
- 在屏幕上创建一个docking caontainer 可以拖动docking
- [分享][VB.Net]可以随意拖动的窗体类
- 可以随意拖动的div对象操作sample
- MFC 怎样才可以让应用窗口随意拖动
- Android自定义可以随意拖动的ImageView和TextView
- 自定义view画圆,并且圆可以随意拖动
- 一个可以在页面上随意画线、多边形、圆,填充等功能的js
- 一个可以在页面上随意画线、多边形、圆,填充等功能的js
- day02
- FPGA 脉动阵列的设计
- 39-Vocabulary
- 无法启动此程序,因为计算机中丢失AdbWinApi.dll。尝试重新安装该程序以解决此问题
- An Introduction to libuv
- 键盘可以在界面上随意拖动,键盘输入
- linux insmod error -1 required key invalid
- 欢迎使用CSDN-markdown编辑器
- sqlserver数据库使用空间监控
- struts2 OGNL,struts2 表达式语言,Struts2 中OGNL表达式的用法,Struts2 #,表达式语言的好处,Struts2 $,struts2 井号,星号,百分号
- leecode 解题总结:64. Minimum Path Sum
- java并发编程实践学习(6 )任务执行
- python with mysql
- Hive教程之metastore的三种模式