IPhone - Клавиатура скрывает TextField

Я использую UITextField для получения пользовательских входов. Однако, так как мои текстовые поля расположены к середине/нижней части ниба, он скрывается, когда клавиатура всплывает. Есть ли способ соскользнуть вместе с клавиатурой так, чтобы она находилась на верхней части клавиатуры во время выбора? Кроме того, поскольку я также использую цифровую панель, есть ли простой способ включить какую-нибудь кнопку?

Спасибо за помощь.

Ответ 1

Чтобы прокручиваться, когда появляется клавиатура, мне нравится этот учебник из Cocoa With Love.

Чтобы отклонить цифровую клавиатуру, вы можете поместить пользовательскую кнопку "Готово" на клавиатуре или сделать невидимую кнопку над остальной частью экран. Я сделал последнее с кодом, но этот учебник использует Interface Builder.

Ответ 2

Я сделал простое приложение для этой проблемы. Он автоматически проверяет положение текстового поля, и если клавиатура скрывает его, он автоматически перемещается вверх по мере необходимости.


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


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


- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    int animatedDistance;
    int moveUpValue = textField.frame.origin.y+ textField.frame.size.height;
    UIInterfaceOrientation orientation =
    [[UIApplication sharedApplication] statusBarOrientation];
    if (orientation == UIInterfaceOrientationPortrait ||
        orientation == UIInterfaceOrientationPortraitUpsideDown)
    {

        animatedDistance = 216-(460-moveUpValue-5);
    }
    else
    {
        animatedDistance = 162-(320-moveUpValue-5);
    }

    if(animatedDistance>0)
    {
        const int movementDistance = animatedDistance;
        const float movementDuration = 0.3f; 
        int movement = (up ? -movementDistance : movementDistance);
        [UIView beginAnimations: nil context: nil];
        [UIView setAnimationBeginsFromCurrentState: YES];
        [UIView setAnimationDuration: movementDuration];
        self.view.frame = CGRectOffset(self.view.frame, 0, movement);       
        [UIView commitAnimations];
    }
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField {

    [textField resignFirstResponder];
    return YES;
}

Ответ 4

Используйте этот код:

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// register for keyboard notifications
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidShow:) 
                                             name:UIKeyboardDidShowNotification 
                                           object:self.view.window];
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidHide:) 
                                             name:UIKeyboardDidHideNotification 
                                           object:self.view.window];
}


- (void)viewDidDisappear:(BOOL)animated {
// unregister for keyboard notifications while not visible.
[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIKeyboardDidShowNotification 
                                              object:nil]; 
[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIKeyboardDidHideNotification 
                                              object:nil];
}

- (void)keyboardDidHide:(NSNotification *)n
{
CGRect viewFrame = scrollView.frame;
UIDeviceOrientation orientSide = [[UIDevice currentDevice] orientation];
if ((orientSide == UIDeviceOrientationLandscapeRight) || (orientSide == UIDeviceOrientationLandscapeLeft)) 
    viewFrame.size.height += 140;
else viewFrame.size.height += 216; //portrait mode
scrollView.frame = viewFrame;
keyboardVisible = NO;
}

- (void)keyboardDidShow:(NSNotification *)n
{
CGRect viewFrame = scrollView.frame;
UIDeviceOrientation orientSide = [[UIDevice currentDevice] orientation];
if ((orientSide == UIDeviceOrientationLandscapeRight) || (orientSide == UIDeviceOrientationLandscapeLeft)) 
    viewFrame.size.height -= 140;
else viewFrame.size.height -= 216; //portrait mode
scrollView.frame = viewFrame;
keyboardVisible = YES; }

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
CGRect viewFrame = scrollView.frame;
if ((interfaceOrientation == UIDeviceOrientationLandscapeRight) || (interfaceOrientation == UIDeviceOrientationLandscapeLeft)) //wants to change to landscape mode
    if (keyboardVisible == NO)//currently in portrait,check if keyboard was present
            viewFrame.size = CGSizeMake(480,250);
    else viewFrame.size = CGSizeMake(480,170);
else {//wants to change to portrait mode
    if (keyboardVisible == NO)//currently in landscape,check if keyboard was present
        viewFrame.size = CGSizeMake(320,416);
    else viewFrame.size = CGSizeMake(320,200);
}
scrollView.frame = viewFrame;

return YES;
}

Работает и для ландшафтного режима, но только для iphone. Для iPad измените настройки кадра соответственно. Метод textFieldShouldReturn: заставит клавиатуру спрятаться при нажатии на возврат. Надеюсь, это поможет...

Ответ 5

Ниже код работает идеально для меня.

[textFieldFocused becomeFirstResponder];
[self.view addSubview:startView];
[textFieldFocused resignFirstResponder];

Ответ 6

если кому-то это нужно, я перевел решение ValayPatel на быстрый

func animatedTextField(textField: UITextField, up: Bool){
    var animatedDistance : Int = 0
    let moveUpValue : Int = Int(textField.frame.origin.y) + Int(textField.frame.size.height)

    switch UIDevice.currentDevice().orientation {
    case .Portrait , .PortraitUpsideDown:
        animatedDistance = 216 - (460 - moveUpValue - 5)
    default:
        animatedDistance = 162 - (320 - moveUpValue - 5)
    }

    if (animatedDistance > 0 ){

        let movementDistance : Int = animatedDistance
        let movementDuration : Float = 0.3
        let movement = up ? -movementDistance : movementDistance
        UIView.beginAnimations(nil, context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(NSTimeInterval(movementDuration))
        self.view.frame = CGRectOffset(self.view.frame, 0, CGFloat(movement))
        UIView.commitAnimations()

    }

}

Ответ 7

Эта ситуация отстойная на iPhone. То, что вы должны делать, - это либо создать свой интерфейс таким образом, чтобы поля были видны при появлении клавиатуры, либо сдвиньте поле вверх, когда появится клавиатура. (И вернитесь, когда закончите)

Я предлагаю посмотреть некоторые приложения Apple, такие как "Контакты" или "Настройки", чтобы узнать, как они справляются с этим.

Кроме того, я уверен, что iPhone HIG должен что-то сказать об этом.

Ответ 8

Я знаю, что немного опоздал с ответом на это, но нашел очень простое решение. Если вы используете контроллер UITableView, а не UIViewController, имеющий tableView как объект в нем, эта проблема не появляется.

Когда вы нажимаете текстовое поле, расположенное в нижней части таблицы, клавиатура всплывает, и представление таблицы автоматически прокручивается до тех пор, пока видимое текстовое поле не будет видно.

Однако автоматическая прокрутка не работает, когда мы используем кнопку возврата на клавиатуре. В этом случае мы вручную прокручиваем таблицу до текстового поля.

Я надеюсь, что это поможет

Ответ 9

Я искал бесчисленные ответы на подобные вопросы. Для базовых приложений с одним экраном эти решения работают как шарм и невероятно просты в реализации: https://github.com/michaeltyson/TPKeyboardAvoiding

Конечно, есть более элегантные решения, но это ускорит работу.

Ответ 10

Это просто, как настройка режима UITableView в редакторе!

- (void)viewDidLoad {

    [super viewDidLoad];

    [self.tableView setEditing:YES];
}

Если вы хотите скрыть удаленные бублики, слева от ячейки, тогда реализуйте метод UITableViewDelegate:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {

    return NO;
}

Ответ 11

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    NSLog(@"%f",textField.frame.origin.y);

    CGPoint scrollPoint = CGPointMake(0, textField.frame.origin);
    [scrollView setContentOffset:scrollPoint animated:YES];
}

- (void)textFieldDidEndEditing:(UITextField *)textField 
{
    [scrollView setContentOffset:CGPointZero animated:YES];
}

Ответ 12

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

Пожалуйста, используйте этот код в вашем файле controller.m.. При использовании этого кода, когда вы нажимаете текстовое поле, клавиатура появится. При нажатии на ваш вид клавиатура будет скрыта. Надеюсь, это поможет вам...