iPhone - клавиатура скрывает TextField - PullRequest
22 голосов
/ 21 февраля 2010

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

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

Ответы [ 12 ]

26 голосов
/ 04 мая 2011

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


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

17 голосов
/ 21 февраля 2010

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

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

3 голосов
/ 12 июля 2016

если кому-то это нужно, я перевел решение 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 голосов
/ 25 октября 2012

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

[textFieldFocused becomeFirstResponder];
[self.view addSubview:startView];
[textFieldFocused resignFirstResponder];
3 голосов
/ 23 июня 2011

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

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

3 голосов
/ 04 января 2010

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

1 голос
/ 21 февраля 2010

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

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

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

0 голосов
/ 02 апреля 2015
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField:textField up:YES];
}

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

0 голосов
/ 05 марта 2014
- (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 голосов
/ 09 августа 2013

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

- (void)viewDidLoad {

    [super viewDidLoad];

    [self.tableView setEditing:YES];
}

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

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

    return NO;
}
...