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

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

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

12 ответов

Решение

Для прокрутки при появлении клавиатуры мне нравится этот урок из Какао с любовью.

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

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


- (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;
}

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

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

Вам придется сделать это вручную. Проверьте этот ответ. UITextField: переместить вид при появлении клавиатуры

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

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()

    }

}

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

- (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: метод заставит клавиатуру прятаться при нажатии return. Надеюсь это поможет...

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

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

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

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

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

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

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

- (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];
}

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

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

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

- (void)viewDidLoad {

    [super viewDidLoad];

    [self.tableView setEditing:YES];
}

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

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

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

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

Другие вопросы по тегам