Как получить размер UIKeyboard с Apple iPhone SDK
Есть ли способ получить размер UIKeyboard программно. 216.0f высота и 162.0f высота в ландшафте.
Кажется, что их лишают. Есть ли способ, который работает без предупреждения в 3.0 SDK для iPhone OS и 4.0 SDK для iPhone, чтобы это сделать.
CGSize keyBoardSize = [[[note userInfo] objectForKey:UIKeyboardBoundsUserInfoKey]CGRectValue].size;
Спасибо, Тарину
- Данные о сердечном ритме на яблоне
- Как использовать NSTimer?
- Objective-C: Как изменить class объекта во время выполнения?
- Работает ли UIGestureRecognizer на UIWebView?
- Как заполнить фоновое изображение UIView
- как отобразить тестовый баннер IAd в симуляторе
- Автоматически запускать локальные уведомления ежедневно в динамическое время, заданное в массивах. objective ios
- Собственное использование приложения делегата приложения iPhone
- Правильный способ выхода из приложения iPhone?
- Получение списка файлов в каталоге с глобусом
- Использование MPMediaItems с AVAudioPlayer
- Как я могу изменить NSArray в Objective-C?
- Как добавить userInfo в UIAlertView?
Вы можете получить размер клавиатуры из словаря userInfo, используя вместо этого UIKeyboardFrameBeginUserInfoKey и UIKeyboardFrameEndUserInfoKey .
Эти два ключа возвращают экземпляр NSValue
содержащий CGRect
который содержит положение и размер клавиатуры в начальной и конечной точках анимации show / hide на клавиатуре.
Редактировать:
Чтобы уточнить, словарь 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
этого вы должны использовать 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! }
Вот как я наконец сделал работы. Я объединил предложения и коды из разных ответов. Особенности: отклонение клавиатуры, перемещение текстовых полей над клавиатурой при редактировании и установка типа «Next» и «Done» для клавиатуры. REPLACE «…» с большим количеством полей
static const CGFloat ANIMATION_DURATION = 0.4; static const CGFloat LITTLE_SPACE = 5; CGFloat animatedDistance; CGSize keyboardSize; @interface ViewController () @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
С быстрым 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) } }