Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用iOS获取UIC键盘大小_Ios_Objective C_Iphone_Soft Keyboard - Fatal编程技术网

如何使用iOS获取UIC键盘大小

如何使用iOS获取UIC键盘大小,ios,objective-c,iphone,soft-keyboard,Ios,Objective C,Iphone,Soft Keyboard,是否有某种方法可以通过编程方式获得UI键盘大小。景观中的216.0f高度和162.0f高度 以下内容似乎不受欢迎。在3.0版iPhone OS SDK和4.0版iPhone OS SDK中,是否有一些方法可以在没有任何警告的情况下实现这一点 CGSize keyBoardSize = [[[note userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size; 您可以

是否有某种方法可以通过编程方式获得UI键盘大小。景观中的216.0f高度和162.0f高度

以下内容似乎不受欢迎。在3.0版iPhone OS SDK和4.0版iPhone OS SDK中,是否有一些方法可以在没有任何警告的情况下实现这一点

CGSize keyBoardSize = [[[note userInfo]
                        objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size;

您可以使用UIKeyboardFrameBeginUserInfo键和UIKeyboardFrameEndUserInfo键从
userInfo
字典中获取键盘大小

这两个键返回一个
NSValue
实例,其中包含一个
CGRect
,该实例在键盘的显示/隐藏动画的起点和终点保持键盘的位置和大小

编辑:

要澄清的是,
userInfo
字典来自一个NSNotification实例。它将传递给您的方法,您可以向观察者注册。比如说,

- (void)someMethodWhereYouSetUpYourObserver
{
    // This could be in an init method.
    [[NSNotificationCenter defaultCenter] addObserver:self 
                    selector:@selector(myNotificationMethod:) 
                    name:UIKeyboardDidShowNotification 
                    object:nil];
}

- (void)myNotificationMethod:(NSNotification*)notification
{
    NSDictionary* keyboardInfo = [notification userInfo];
    NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey];
    CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue];
}
编辑2:


另外,请不要忘记在
dealloc
方法中删除自己作为观察者的身份!这是为了避免在对象释放后通知中心试图通知对象时发生崩溃。

您应该改用
UIKeyboardWillChangeFrameNotification
,因为某些国际键盘(如中文键盘)在使用过程中会更改帧。还要确保将
CGRect
转换为正确的视图,以便横向使用

//some method like viewDidLoad, where you set up your observer.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

- (void)keyboardWillChange:(NSNotification *)notification {
    CGRect keyboardRect = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    keyboardRect = [self.view convertRect:keyboardRect fromView:nil]; //this is it!
}

下面是我最终如何制作作品的。我结合了来自不同答案的建议和代码。 功能:关闭键盘,在编辑和设置“下一步”和“完成”键盘返回类型时将文本字段移到键盘上方。用更多字段替换“…”

static const CGFloat ANIMATION_DURATION = 0.4;
static const CGFloat LITTLE_SPACE = 5;
CGFloat animatedDistance;
CGSize keyboardSize;

@interface ViewController () <UITextFieldDelegate>
 @property (weak, nonatomic) IBOutlet UITextField *firstNameTXT;
  .....// some other text fields
 @property (weak, nonatomic) IBOutlet UITextField *emailTXT;
@end

@implementation ViewController
- (void)viewDidLoad{
.....
// add tap gesture to help in dismissing keyboard
UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc]
                                       initWithTarget:self
                                       action:@selector(tapScreen:)];// outside textfields

[self.view addGestureRecognizer:tapGesture];

// set text fields return key type to Next, last text field to Done
[self.firstNameTXT setReturnKeyType:UIReturnKeyNext];
.....
[self.emailTXT setReturnKeyType:UIReturnKeyDone];

// set text fields tags
[self.firstNameTXT setTag:0];
....// more text fields
[self.emailTXT setTag:5];

// add keyboard notification
[[NSNotificationCenter defaultCenter] addObserver:self     selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
}
[[NSNotificationCenter defaultCenter] addObserver:self      selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
}

// dismiss keyboard when tap outside text fields
- (IBAction)tapScreen:(UITapGestureRecognizer *)sender {
  if([self.firstNameTXT isFirstResponder])[self.firstNameTXT resignFirstResponder];
  ...
  if([self.emailTXT isFirstResponder])[self.emailTXT  resignFirstResponder];

  }
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
   if(textField.returnKeyType==UIReturnKeyNext) {
     // find the text field with next tag
     UIView *next = [[textField superview] viewWithTag:textField.tag+1];
     [next becomeFirstResponder];
   } else if (textField.returnKeyType==UIReturnKeyDone || textField.returnKeyType==UIReturnKeyDefault) {
    [textField resignFirstResponder];
 }
return YES;
}

// Moving current text field above keyboard
-(BOOL) textFieldShouldBeginEditing:(UITextField*)textField{
   CGRect viewFrame = self.view.frame;
   CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
   CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view];
   CGFloat textFieldBottomLine = textFieldRect.origin.y + textFieldRect.size.height + LITTLE_SPACE;//

   CGFloat keyboardHeight = keyboardSize.height;

   BOOL isTextFieldHidden = textFieldBottomLine > (viewRect.size.height - keyboardHeight)? TRUE :FALSE;
  if (isTextFieldHidden) {
    animatedDistance = textFieldBottomLine - (viewRect.size.height - keyboardHeight) ;
    viewFrame.origin.y -= animatedDistance;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:ANIMATION_DURATION];
    [self.view setFrame:viewFrame];
    [UIView commitAnimations];
  }
  return YES;
}

-(void) restoreViewFrameOrigionYToZero{
  CGRect viewFrame = self.view.frame;
  if (viewFrame.origin.y != 0) {
    viewFrame.origin.y = 0;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:ANIMATION_DURATION];
    [self.view setFrame:viewFrame];
    [UIView commitAnimations];
  }
}

-(void)keyboardDidShow:(NSNotification*)aNotification{
   NSDictionary* info = [aNotification userInfo];
   keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
 }

-(void)keyboardDidHide:(NSNotification*)aNotification{
   [self restoreViewFrameOrigionYToZero];// keyboard is dismissed, restore frame view to its  zero origin
}
@end
静态常量CGFloat动画\u持续时间=0.4;
静态常数CGFloat小_空间=5;
CGFloat距离;
CGSize键盘大小;
@界面视图控制器()
@属性(弱,非原子)IBOutlet UITextField*firstNameTXT;
..…//其他一些文本字段
@属性(弱,非原子)IBOutlet UITextField*emailTXT;
@结束
@实现视图控制器
-(无效)viewDidLoad{
.....
//添加轻触手势以帮助关闭键盘
UITapGestureRecognizer*点击手势=[[UITapGestureRecognizer alloc]
initWithTarget:self
操作:@selector(tapScreen:)];//外部文本字段
[self.view addgesturecognizer:tappership];
//将文本字段返回键类型设置为“下一个”,最后一个文本字段设置为“完成”
[self.firstNameTXT setReturnKeyType:UIReturnKeyNext];
.....
[self.emailTXT setReturnKeyType:UIReturnKeyDone];
//设置文本字段标记
[self.firstNameTXT setTag:0];
..//更多文本字段
[self.emailTXT setTag:5];
//添加键盘通知
[[NSNotificationCenter defaultCenter]添加观察者:自选择器:@selector(keyboardDidShow:)名称:UIKeyboardDidShowNotification对象:nil];
}
[[NSNotificationCenter defaultCenter]添加观察者:自选择器:@selector(keyboardDidHide:)名称:UIKeyboardDidHideNotification对象:nil];
}
//点击文本字段外部时关闭键盘
-(iAction)点击屏幕:(UITapgestureRecognitor*)发送方{
如果([self.firstnametx isFirstResponder])[self.firstnametx辞职firstresponder];
...
如果([self.emailTXT isFirstResponder])[self.emailTXT辞职firstresponder];
}
-(BOOL)textField应返回:(UITextField*)textField{
if(textField.returnKeyType==UIReturnKeyNext){
//查找带有下一个标记的文本字段
UIView*next=[[textField superview]viewWithTag:textField.tag+1];
[下一步成为第一响应者];
}else if(textField.returnKeyType==UIReturnKeyDone | | textField.returnKeyType==UIReturnKeyDefault){
[textField resignFirstResponder];
}
返回YES;
}
//将当前文本字段移到键盘上方
-(BOOL)textField应该开始编辑:(UITextField*)textField{
CGRect viewFrame=self.view.frame;
CGRect textFieldRect=[self.view.window convertRect:textField.bounds fromView:textField];
CGRect viewRect=[self.view.window convertRect:self.view.bounds fromView:self.view];
CGFloat textFieldBottomLine=textFieldRect.origin.y+textFieldRect.size.height+LITTLE_空格//
CGFloat keyboardHeight=keyboardSize.height;
BOOL isTextFieldHidden=textfieldbootline>(viewRect.size.height-keyboardHeight)?真:假;
如果(isTextFieldHidden){
animatedDistance=textFieldBottomLine-(viewRect.size.height-键盘高度);
viewFrame.origin.y-=动画距离;
[UIView beginAnimations:nil上下文:NULL];
[UIView setAnimationBeginsFromCurrentState:是];
[UIView setAnimationDuration:ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView委员会];
}
返回YES;
}
-(无效)将REPORTEVIEWFRAMEORIGIONY恢复为零{
CGRect viewFrame=self.view.frame;
if(viewFrame.origin.y!=0){
viewFrame.origin.y=0;
[UIView beginAnimations:nil上下文:NULL];
[UIView setAnimationBeginsFromCurrentState:是];
[UIView setAnimationDuration:ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView委员会];
}
}
-(无效)键盘显示:(NSNotification*)提示{
NSDictionary*info=[aNotification userInfo];
keyboardSize=[[info objectForKey:UIKeyboardFrameBeginUserInfo]CGRectValue].size;
}
-(无效)键盘隐藏:(NSNotification*)加密{
[self restoreViewFrameOrigionYToZero];//键盘已关闭,请将帧视图恢复到其零原点
}
@结束
在swift 4上

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(getInfo(notif:)), name: .UIKeyboardDidShow , object: nil)
}
然后:

@objc func getInfo(notif: NSNotification) -> Void {  
    guard let userInfo = notif.userInfo else {return}

    if let myData = userInfo["UIKeyboardFrameBeginUserInfoKey"] as? CGRect {
        print(myData.width)
        print(myData.height)
    }
}

很抱歉在这里复活了一个僵尸,但是userInfo字典是从哪里来的?我要调用什么对象来获取它?userInfo?我想你应该看看这个问题来解决这个问题
keyboardFrameBeginRect
的原点和大小值可能与您预期的不同,例如,如果设备处于横向位置。要解决这个问题,只需将返回的rect转换为适当的坐标。假设观察者是视图控制器,再添加一行代码如下:
CGRect keyboardFrameFixed=[self.view convertRect:key