Как получить размер 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; 

Спасибо, Тарину

Вы можете получить размер клавиатуры из словаря 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) } } 
  • Как установить приложение Cocoa в качестве браузера по умолчанию?
  • как скрыть навигационную панель, когда я нажимаю навигационный controller?
  • Можете ли вы настраивать анимацию для встраиваемых ячеек UITableView?
  • NSTimeZone: в чем разница между localTimeZone и systemTimeZone?
  • UIPageViewController не возвращает никаких распознавателей жестов в iOS 6
  • Позиционирование MKMapView для одновременного отображения нескольких аннотаций
  • Как использовать CaptiveNetwork для получения текущего имени точки доступа Wi-Fi
  • Могу ли я отключить прокрутку звука UIPickerView?
  • NSArray слабых ссылок (__unsafe_unretained) для объектов под ARC
  • Можно ли изменить цвет фона UIButtons?
  • Преобразование NSString даты в NSDate
  • Interesting Posts

    Может ли (доменное имя) поддомены подчеркивать «_»?

    Как обеспечить доступ других компьютеров к файлам на внешнем (съемном) жестком диске?

    Как интерпретировать статистику прогона memtest?

    Как удалить 2-пиксельную строку строки задач в Windows 7, когда панель задач скрыта?

    Необходимо восстановить данные с ноутбука, прежде чем отправлять его на ремонт

    DisplayNameFor () из списка в модели

    Можно ли постоянно отключать доступ в Интернет в Ubuntu?

    Как изменить цвет разделителя в NavigationView?

    Использование команды cd в командной строке Windows не может перейти к D: \

    Почему allow.cartesian требуется в моменты, когда при подключении data.tables с дублирующими ключами?

    Word 2010 – ключ реестра для параметров автозамены

    Указанный модуль не удалось найти (удалить)

    что такое возвращаемый тип оператора присваивания?

    Известные проблемы с двойной загрузкой Windows 8 и Fedora 17

    Переходы на дисплее: свойство

    Давайте будем гением компьютера.