Крышки клавиатуры iPhone UITextField - PullRequest
121 голосов
/ 08 августа 2009

У меня есть приложение, в котором в Интерфейсном Разработчике я установил UIView с текстовым полем в нижней части представления. Когда я запускаю приложение и пытаюсь ввести текст в это поле, клавиатура скользит вверх над полем, поэтому я не могу видеть, что я печатаю, пока я снова не скрою клавиатуру.

Кто-нибудь еще сталкивался с этой проблемой и нашел хороший способ ее решения без необходимости прокрутки родительского представления или перемещения текстового поля дальше вверх по экрану?

Ответы [ 18 ]

1 голос
/ 08 августа 2009

Я полагаю, что одним из способов было бы переместить всю позицию ваших представлений с (x, y) на (x, y-keybaardHeight) при нажатии текстового поля и вернуть его обратно, когда клавиатура закрыта, может выглядеть немного странно, как представление только появляется (возможно, это не будет плохо, если вы оживите его).

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect frame=self.view.frame;
    frame.origin=CGPointMake(x...//set point here
    self.view.frame=frame;
}
0 голосов
/ 19 ноября 2014

Я полагаю, что в более новых версиях iOS (6.1+, возможно, даже раньше) базовое представление, по крайней мере для UITableView, автоматически сжимается при всплывающей клавиатуре. Таким образом, вам нужно только сделать текстовое поле видимым в этом представлении. В init:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];

тогда:

- (void)keyboardWasShown:(NSNotification*)notification
{
    // Scroll the text field into view so it's not under the keyboard.
    CGRect rect = [self.tableView convertRect:inputView.bounds fromView:inputView];
    [self.tableView scrollRectToVisible:rect animated:YES];
}
0 голосов
/ 27 февраля 2014

У меня есть что-то еще, если хотите. Дело в том, что вы хотите установить центр вашего UIView на текстовое поле, которое вы редактируете.

Перед этим вы должны сохранить INITIAL_CENTER как CGPoint , из self.view.center и ваш INITIAL_VIEW как CGRect из self.view.frame в свойстве const.

Вы можете создать метод, подобный этому:

- (void) centerOn: (CGRect) fieldFrame {

    // Set up the center by taking the original view center
    CGPoint center = CGPointMake(INITIAL_CENTER.x,
                             INITIAL_CENTER.y - ((fieldFrame.origin.y + fieldFrame.size.height/2) - INITIAL_CENTER.y));


    [UIView beginAnimations:@"centerViewOnField" context:nil];
    [UIView setAnimationDuration:0.50];

    if (CGRectEqualToRect(fieldFrame,INITIAL_VIEW)) {
        self.view.frame = INITIAL_VIEW;
        [self.view setCenter:INITIAL_CENTER];
    } else {
        [self.view setCenter:center];
    }


    [UIView commitAnimations];
}

Затем на UITextFieldDelegate необходимо вызвать centerOn: (CGRect) следующими способами:

textFieldDidBeginEditing: (UITextField *) с, в качестве параметра, рамкой текстового поля, на котором вы хотите центрироваться.

И вы должны вызвать его в обработчике событий, где вы закрываете клавиатуру,

textFieldDidEndEditing: (UITextField *) может быть одним из способов сделать это, поместив INITIAL_VIEW в качестве параметра centerOn: (CGRect) .

0 голосов
/ 14 января 2014

Просто сдвиньте вид вверх и вниз по мере необходимости:

- (void)textFieldDidEndEditing:(UITextField *)textField {
    self.currentTextField = nil;
    [self animateTextField: textField up: NO];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [self.currentTextField resignFirstResponder];
    return YES;
}

- (void) animateTextField:(UITextField*) textField up:(BOOL)up {
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView animateWithDuration:movementDuration animations:^{
        self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    }];
}

Не забудьте установить self как UITextFieldDelegate и как фактическое textField delegate.

(благодаря Ammagrammer, это просто более короткий ответ с использованием блоков для анимации)

0 голосов
/ 17 августа 2012

В дополнение к решению Amagrammer, если вы используете cocos2d в портретном режиме, измените эту строку:

self.view.frame = CGRectOffset(self.view.frame, 0, movement);

к этому:

[CCDirector sharedDirector].openGLView.frame = CGRectOffset([CCDirector sharedDirector].openGLView.frame, movement, 0);

Если вы используете cocos2d в ландшафтном режиме, внесите вышеуказанные изменения и переключите значения up в textFieldDidBeginEditing: и textFieldDidEndEditing:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    [self animateTextField:textField up:NO];
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [self animateTextField:textField up:YES];
}
0 голосов
/ 24 октября 2011

Перетащите рамки, которые я использую в своих проектах. Поддерживает автоматическое увольнение при нажатии за пределами первого респондента или при прокрутке.

GTKeyboardHelper

0 голосов
/ 24 ноября 2016

https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example Надеюсь, это решение помогло. Все они написаны на Swift 3.

//
//  ViewController.swift
//  Shift Keyboard Example
//
//  Created by Zulwiyoza Putra on 11/23/16.
//  Copyright © 2016 Zulwiyoza Putra. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    
    
    //connecting textfield from storyboard
    @IBOutlet weak var textField: UITextField!
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        subscribeToKeyboardNotifications()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        self.textField.delegate = self
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        unsubscribeFromKeyboardNotifications()
    }
    
    //Hide keyboard after finished editing
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
    
    //Setup view before keyboard appeared
    func keyboardWillAppear(_ notification:Notification) {
        view.frame.origin.y = 0 - getKeyboardHeight(notification)
    }
    
    //Setup view before keyboard disappeared
    func keyboardWillDisappear(_ notification: Notification) {
        view.frame.origin.y = 0
    }
    
    //Getting keyboard height
    func getKeyboardHeight(_ notification:Notification) -> CGFloat {
        let userInfo = notification.userInfo
        let keyboardSize = userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue // of CGRect
        return keyboardSize.cgRectValue.height
    }
    
    //Subscribing to notifications to execute functions
    func subscribeToKeyboardNotifications() {
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear(_:)), name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear(_:)), name: .UIKeyboardWillHide, object: nil)
    }
    
    //Unsubscribing from notifications
    func unsubscribeFromKeyboardNotifications() {
        NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillHide, object: nil)
    }
    
}
0 голосов
/ 25 апреля 2013

У меня была та же проблема, и я обнаружил, что GTKeyboardHelper - это простой выход.

После перетаскивания фреймворка в ваш проект, включите заголовочный файл. Загрузите и откройте пример проекта, затем перетащите объект «Помощник по клавиатуре» из раздела объектов в xib в раздел объектов в конструкторе интерфейса вашего проекта.

Перетащите все свои представления, чтобы быть детьми "Помощника по клавиатуре".

...