如何使用iOS获取UIC键盘大小
是否有某种方法可以通过编程方式获得UI键盘大小。景观中的216.0f高度和162.0f高度 以下内容似乎不受欢迎。在3.0版iPhone OS SDK和4.0版iPhone OS SDK中,是否有一些方法可以在没有任何警告的情况下实现这一点如何使用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; 您可以
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