it-swarm.com.ru

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

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

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

21
intl

Для прокрутки при появлении клавиатуры мне нравится этот урок из Cocoa With Love.

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

16
gerry3

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


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

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

3
Ben Zotto

если кому-то это нужно, я перевел решение 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()

    }

}
3
Andrés Sánchez

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

- (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. Надеюсь это поможет...

3
tipycalFlow

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

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

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

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

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

1
Stefan Arentz

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

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

0
Matt Perejda

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

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

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

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

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

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

0
Roby

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

- (void)viewDidLoad {

    [super viewDidLoad];

    [self.tableView setEditing:YES];
}

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

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

    return NO;
}
0
Adobels
- (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];
}
0
Naresh Jain