Клавиатура скрывает UITextField. Как это решить?
У меня есть текстовое поле, которое находится внизу экрана. Когда я начинаю редактирование, появляется клавиатура, которая скрывает текстовое поле.
Кто-нибудь может подсказать, как это решить?
5 ответов
Обычно вы помещаете содержимое в представление прокрутки и перемещаете представление прокрутки вверх, когда появляется клавиатура. Есть много учебных пособий, так что гуглите их. Here
это один из них.
Вы можете использовать следующий код в двух различных методах, вызывать его, когда редактирование начинается и заканчивается, чтобы перемещать ваше представление вверх и вниз (просто измените значение, которое было вычтено в yourView.frame.origin.y-100
настроить в соответствии с вашими потребностями)
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.5];
yourView.frame = CGRectMake(yourView.frame.origin.x, yourView.frame.origin.y-100, yourView.frame.size.width, yourView.frame.size.height);
[UIView commitAnimations];
Смотрите этот фрагмент кода. И используйте одну кнопку UIB, чтобы закрыть UIKeyboard.
- (void) animateTextField: (UITextField *)textField up:(BOOL) up
{
const int movementDistance = 200;
const float movementDuration = 0.4f;
int movement = (up ? -movementDistance : movementDistance);
up ? (self.button.enabled= YES) : (self.button.enabled = NO);
[UIView beginAnimations: @"anim" context: nil];
[UIView setAnimationBeginsFromCurrentState: YES];
[UIView setAnimationDuration: movementDuration];
self.view.frame = CGRectOffset(self.view.frame, 0, movement);
[UIView commitAnimations];
}
-(void)textFieldDidBeginEditing:(UITextField*) inTextField
{
[self animateTextField:mText up:YES];
[self addObservers];
}
- (void)addObservers
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:@"UITextFieldTextDidChangeNotification" object:nil];
}
- (void)textFieldDidChange:(NSNotification*)aNotification
{
NSLog(@"TextField data=%@",mText.text);
}
- (IBAction) doneBtn:(id)sender
{
[mText resignFirstResponder ];
[self animateTextField:mText up:NO];
}
Когда вы нажимаете на клавиатуре textField вверх, тогда ваш textField скрывается за ней. так что, что вам нужно, вам нужно сделать так, чтобы клавиатура не была решением. так, чтобы вы просмотрели использование
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField delegate for the logic. now see the code
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
if(textField.tag==1) //add tag to your textField to identify it
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.3];
CGRect viewFrame=self.view.frame;
viewFrame=sinViewFrame.size.height+100;
viewFrameorigin.y-=100; // as required
self.view.frame=viewFrame;
[UIView commitAnimations];
}
}
надеюсь, это поможет вам.
Я использую ограничение автоматического макета, чтобы решить эту проблему. Я держу ограничение как свойство и играю с ним, когда клавиатура появляется / исчезает. Я просто перемещаю представления над текстовым полем за пределы экрана, а текстовое поле вверх. Закончив редактирование, я перемещаю их по ограничению в исходное положение.
-(void)keyboardWillShow:(NSNotification*)notification{
[UIView animateWithDuration:0.25 delay:0.0 options:UIViewAnimationOptionTransitionNone animations:^{
self.topSpaceLayoutConstraint.constant = -150;
[self.view setNeedsLayout];
[self.view layoutIfNeeded];
} completion:NULL];
}
-(void)keyboardWillHide:(NSNotification*)notification
{
[UIView animateWithDuration:0.25 delay:0.0 options:UIViewAnimationOptionTransitionNone animations:^{
self.topSpaceLayoutConstraint.constant = 10;
[self.view setNeedsLayout];
[self.view layoutIfNeeded];
} completion:NULL];
}
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *topSpaceLayoutConstraint;