UITextField: переместите представление, когда клавиатура появится

Вы пытаетесь вычислить общие дни/месяцы/годы возраста? у Вас есть срок начала работы? Или Вы пытающийся разделить его (исключая: 24 года, 1 месяц, 29 дней)?

, Если у Вас есть дата начала, с которой Вы работаете, datediff произведет общие дни/месяцы/годы со следующими командами:

Select DateDiff(d,'1984-07-12','2008-09-11')

Select DateDiff(m,'1984-07-12','2008-09-11')

Select DateDiff(yyyy,'1984-07-12','2008-09-11')

с соответствующими выводами, являющимися (8827/290/24).

Теперь, если бы Вы хотели сделать метод рассечения, необходимо было бы вычесть число лет в днях (дни - 365*years), и затем сделать дальнейшую математику на этом для получения месяцев, и т.д.

53
задан ComSubVie 21 November 2009 в 05:57
поделиться

1 ответ

Я только что решил эту проблему. Решение представляет собой комбинацию наблюдателя UIKeyboardDidShowNotification и UIKeyboardDidHideNotification с указанными выше методами textFieldDidBeginEditing: и textFieldDidEndEditing] Вам необходимы:

  • . три дополнительные переменные, один для хранения текущего выбранного UITextField (который я назвал activeField), один для указания того, было ли перемещено текущее представление, и один для указания, отображается ли клавиатура.

    Вот как два UITextField методы делегата теперь выглядят:

    - (void)textFieldDidBeginEditing:(UITextField *)textField {
        activeField = textField;
    }
    
    - (void)textFieldDidEndEditing:(UITextField *)textField {
        activeField = nil;
        // Additional Code
    }
    

    Когда представление загружается, создаются следующие два наблюдателя:

    - (void)viewDidLoad {
        // Additional Code
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWasShown:)
                                                     name:UIKeyboardDidShowNotification
                                                   object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWasHidden:)
                                                     name:UIKeyboardDidHideNotification
                                                   object:nil];
    }
    

    И соответствующие методы реализуются следующим образом:

    - (void)keyboardWasShown:(NSNotification *)aNotification {
        if ( keyboardShown )
            return;
    
        if ( ( activeField != inputAmount ) && ( activeField != inputAge ) ) {
            NSDictionary *info = [aNotification userInfo];
            NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
            CGSize keyboardSize = [aValue CGRectValue].size;
    
            NSTimeInterval animationDuration = 0.300000011920929;
            CGRect frame = self.view.frame;
            frame.origin.y -= keyboardSize.height-44;
            frame.size.height += keyboardSize.height-44;
            [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
            [UIView setAnimationDuration:animationDuration];
            self.view.frame = frame;
            [UIView commitAnimations];
    
            viewMoved = YES;
        }
    
        keyboardShown = YES;
    }
    
    - (void)keyboardWasHidden:(NSNotification *)aNotification {
        if ( viewMoved ) {
            NSDictionary *info = [aNotification userInfo];
            NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
            CGSize keyboardSize = [aValue CGRectValue].size;
    
            NSTimeInterval animationDuration = 0.300000011920929;
            CGRect frame = self.view.frame;
            frame.origin.y += keyboardSize.height-44;
            frame.size.height -= keyboardSize.height-44;
            [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
            [UIView setAnimationDuration:animationDuration];
            self.view.frame = frame;
            [UIView commitAnimations];
    
            viewMoved = NO;
        }
    
        keyboardShown = NO;
    }
    

    Этот код теперь работает, как ожидалось. Клавиатура отключается только при нажатии кнопки «Готово», в противном случае она остается видимой, а представление не перемещается.

    В качестве дополнительного примечания, я думаю, что можно получить animationDuration динамически, задав запрос объект NSNotification , так как я уже играл с аналогичным решением, но не заставил его работать (что теперь работает).

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

    Вот как теперь выглядят два метода делегата UITextField :

    - (void)textFieldDidBeginEditing:(UITextField *)textField {
        activeField = textField;
    }
    
    - (void)textFieldDidEndEditing:(UITextField *)textField {
        activeField = nil;
        // Additional Code
    }
    

    Когда представление загружено, создаются следующие два наблюдателя:

    - (void)viewDidLoad {
        // Additional Code
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWasShown:)
                                                     name:UIKeyboardDidShowNotification
                                                   object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWasHidden:)
                                                     name:UIKeyboardDidHideNotification
                                                   object:nil];
    }
    

    И соответствующие методы реализуются следующим образом:

    - (void)keyboardWasShown:(NSNotification *)aNotification {
        if ( keyboardShown )
            return;
    
        if ( ( activeField != inputAmount ) && ( activeField != inputAge ) ) {
            NSDictionary *info = [aNotification userInfo];
            NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
            CGSize keyboardSize = [aValue CGRectValue].size;
    
            NSTimeInterval animationDuration = 0.300000011920929;
            CGRect frame = self.view.frame;
            frame.origin.y -= keyboardSize.height-44;
            frame.size.height += keyboardSize.height-44;
            [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
            [UIView setAnimationDuration:animationDuration];
            self.view.frame = frame;
            [UIView commitAnimations];
    
            viewMoved = YES;
        }
    
        keyboardShown = YES;
    }
    
    - (void)keyboardWasHidden:(NSNotification *)aNotification {
        if ( viewMoved ) {
            NSDictionary *info = [aNotification userInfo];
            NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
            CGSize keyboardSize = [aValue CGRectValue].size;
    
            NSTimeInterval animationDuration = 0.300000011920929;
            CGRect frame = self.view.frame;
            frame.origin.y += keyboardSize.height-44;
            frame.size.height -= keyboardSize.height-44;
            [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
            [UIView setAnimationDuration:animationDuration];
            self.view.frame = frame;
            [UIView commitAnimations];
    
            viewMoved = NO;
        }
    
        keyboardShown = NO;
    }
    

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

    В качестве дополнительного примечания, я думаю, что можно получить animationDuration динамически, задав запрос объект NSNotification , так как я уже играл с аналогичным решением, но не заставил его работать (что теперь работает).

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

    Вот как теперь выглядят два метода делегата UITextField :

    - (void)textFieldDidBeginEditing:(UITextField *)textField {
        activeField = textField;
    }
    
    - (void)textFieldDidEndEditing:(UITextField *)textField {
        activeField = nil;
        // Additional Code
    }
    

    Когда представление загружено, создаются следующие два наблюдателя:

    - (void)viewDidLoad {
        // Additional Code
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWasShown:)
                                                     name:UIKeyboardDidShowNotification
                                                   object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWasHidden:)
                                                     name:UIKeyboardDidHideNotification
                                                   object:nil];
    }
    

    И соответствующие методы реализуются следующим образом:

    - (void)keyboardWasShown:(NSNotification *)aNotification {
        if ( keyboardShown )
            return;
    
        if ( ( activeField != inputAmount ) && ( activeField != inputAge ) ) {
            NSDictionary *info = [aNotification userInfo];
            NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
            CGSize keyboardSize = [aValue CGRectValue].size;
    
            NSTimeInterval animationDuration = 0.300000011920929;
            CGRect frame = self.view.frame;
            frame.origin.y -= keyboardSize.height-44;
            frame.size.height += keyboardSize.height-44;
            [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
            [UIView setAnimationDuration:animationDuration];
            self.view.frame = frame;
            [UIView commitAnimations];
    
            viewMoved = YES;
        }
    
        keyboardShown = YES;
    }
    
    - (void)keyboardWasHidden:(NSNotification *)aNotification {
        if ( viewMoved ) {
            NSDictionary *info = [aNotification userInfo];
            NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
            CGSize keyboardSize = [aValue CGRectValue].size;
    
            NSTimeInterval animationDuration = 0.300000011920929;
            CGRect frame = self.view.frame;
            frame.origin.y += keyboardSize.height-44;
            frame.size.height -= keyboardSize.height-44;
            [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
            [UIView setAnimationDuration:animationDuration];
            self.view.frame = frame;
            [UIView commitAnimations];
    
            viewMoved = NO;
        }
    
        keyboardShown = NO;
    }
    

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

    В качестве дополнительного примечания, я думаю, что можно получить animationDuration динамически, задав запрос объект NSNotification , так как я уже играл с подобным решением, но не заставил его работать (что теперь работает).

    Вот так теперь выглядят два метода делегата UITextField :

    - (void)textFieldDidBeginEditing:(UITextField *)textField {
        activeField = textField;
    }
    
    - (void)textFieldDidEndEditing:(UITextField *)textField {
        activeField = nil;
        // Additional Code
    }
    

    Когда представление загружается, создаются следующие два наблюдателя:

    - (void)viewDidLoad {
        // Additional Code
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWasShown:)
                                                     name:UIKeyboardDidShowNotification
                                                   object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWasHidden:)
                                                     name:UIKeyboardDidHideNotification
                                                   object:nil];
    }
    

    И соответствующие методы реализуются следующим образом:

    - (void)keyboardWasShown:(NSNotification *)aNotification {
        if ( keyboardShown )
            return;
    
        if ( ( activeField != inputAmount ) && ( activeField != inputAge ) ) {
            NSDictionary *info = [aNotification userInfo];
            NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
            CGSize keyboardSize = [aValue CGRectValue].size;
    
            NSTimeInterval animationDuration = 0.300000011920929;
            CGRect frame = self.view.frame;
            frame.origin.y -= keyboardSize.height-44;
            frame.size.height += keyboardSize.height-44;
            [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
            [UIView setAnimationDuration:animationDuration];
            self.view.frame = frame;
            [UIView commitAnimations];
    
            viewMoved = YES;
        }
    
        keyboardShown = YES;
    }
    
    - (void)keyboardWasHidden:(NSNotification *)aNotification {
        if ( viewMoved ) {
            NSDictionary *info = [aNotification userInfo];
            NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
            CGSize keyboardSize = [aValue CGRectValue].size;
    
            NSTimeInterval animationDuration = 0.300000011920929;
            CGRect frame = self.view.frame;
            frame.origin.y += keyboardSize.height-44;
            frame.size.height -= keyboardSize.height-44;
            [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
            [UIView setAnimationDuration:animationDuration];
            self.view.frame = frame;
            [UIView commitAnimations];
    
            viewMoved = NO;
        }
    
        keyboardShown = NO;
    }
    

    ] Теперь этот код работает должным образом. Клавиатура отключается только при нажатии кнопки «Готово», в противном случае она остается видимой, а представление не перемещается.

    В качестве дополнительного примечания, я думаю, что можно получить animationDuration динамически, задав запрос объект NSNotification , так как я уже играл с аналогичным решением, но не заставил его работать (что теперь работает).

    Вот так теперь выглядят два метода делегата UITextField :

    - (void)textFieldDidBeginEditing:(UITextField *)textField {
        activeField = textField;
    }
    
    - (void)textFieldDidEndEditing:(UITextField *)textField {
        activeField = nil;
        // Additional Code
    }
    

    Когда представление загружается, создаются следующие два наблюдателя:

    - (void)viewDidLoad {
        // Additional Code
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWasShown:)
                                                     name:UIKeyboardDidShowNotification
                                                   object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWasHidden:)
                                                     name:UIKeyboardDidHideNotification
                                                   object:nil];
    }
    

    И соответствующие методы реализуются следующим образом:

    - (void)keyboardWasShown:(NSNotification *)aNotification {
        if ( keyboardShown )
            return;
    
        if ( ( activeField != inputAmount ) && ( activeField != inputAge ) ) {
            NSDictionary *info = [aNotification userInfo];
            NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
            CGSize keyboardSize = [aValue CGRectValue].size;
    
            NSTimeInterval animationDuration = 0.300000011920929;
            CGRect frame = self.view.frame;
            frame.origin.y -= keyboardSize.height-44;
            frame.size.height += keyboardSize.height-44;
            [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
            [UIView setAnimationDuration:animationDuration];
            self.view.frame = frame;
            [UIView commitAnimations];
    
            viewMoved = YES;
        }
    
        keyboardShown = YES;
    }
    
    - (void)keyboardWasHidden:(NSNotification *)aNotification {
        if ( viewMoved ) {
            NSDictionary *info = [aNotification userInfo];
            NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
            CGSize keyboardSize = [aValue CGRectValue].size;
    
            NSTimeInterval animationDuration = 0.300000011920929;
            CGRect frame = self.view.frame;
            frame.origin.y += keyboardSize.height-44;
            frame.size.height -= keyboardSize.height-44;
            [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
            [UIView setAnimationDuration:animationDuration];
            self.view.frame = frame;
            [UIView commitAnimations];
    
            viewMoved = NO;
        }
    
        keyboardShown = NO;
    }
    

    ] Теперь этот код работает должным образом. Клавиатура отключается только при нажатии кнопки «Готово», в противном случае она остается видимой, а представление не перемещается.

    В качестве дополнительного примечания, я думаю, что можно получить animationDuration динамически, задав запрос объект NSNotification , так как я уже играл с подобным решением, но не заставил его работать (что теперь работает).

  • 30
    ответ дан 7 November 2019 в 08:46
    поделиться