#animation #uiviewcontroller #constraints
#Анимация #uiviewcontroller #ограничения
Вопрос:
следующий код используется для перемещения позиции текстового поля в место редактирования в приложении. к сожалению, это не дает желаемого эффекта.
textfield1 перемещается по X в свое конечное местоположение, а затем по y в свое конечное местоположение.
я хочу, чтобы оба ограничения создавали диагональное движение текстового поля, но это не работает при тестировании на iPhone.
анимация работает, но в итоге я получаю перевернутое движение в форме буквы «L» вместо диагонального движения «»
любые предложения, как это исправить, будут приняты с благодарностью.
-(void)textFieldEditingPosition
{
NSLog(@"editing");
[_regular setNeedsUpdateConstraints];
switch (_activeTextField.tag)
{
case 1:
self.textField2WidthConstraint.constant =_regular.frame.size.width/4 -16;
self.textField2XConstraint.constant = -_regular.frame.size.width/4 - self.textField2WidthConstraint.constant/2 -8;
self.textField2YConstraint.constant = -(_regular.frame.size.height/2 -_inputView.frame.size.height/2);
_textField1YConstraint.constant = 0;
_textField1XConstraint.constant = 0;
_textField1WidthConstraint.constant = _placeHolderTextfield.frame.size.width;
break;
case 2:
self.textField1XConstraint.constant = (_regular.frame.size.width /4) /2;
self.textField1YConstraint.constant = -(_regular.frame.size.height/8 -8) ;
self.textField1WidthConstraint.constant = _regular.frame.size.width/4 * 3 -16;
self.textField2YConstraint.constant =0;
self.textField2XConstraint.constant = 0;
self.textField2WidthConstraint.constant = _placeHolderTextfield.frame.size.width;
break;
default:
break;
}
[UIView animateWithDuration:0.7
delay: 0.0
options: UIViewAnimationOptionCurveEaseInOut
animations:^{
[self.view layoutIfNeeded];
}
completion:nil];
}
Ответ №1:
Мне удалось решить эту проблему следующим образом
сначала я включил медленную анимацию в симуляторе.
это позволило мне точно увидеть, что происходит. Движение в форме буквы L, которое я видел, на самом деле было иллюзией, вызванной расширением ширины текстового поля по мере перемещения текстового поля в новую позицию x и y.
расширяющаяся ширина как бы отменяет движение в x, которое я ожидал увидеть.
разделяя расширение ширины на завершение анимации, я получаю нужный мне результат, который представляет собой диагональное перемещение текстового поля в положение редактирования.
расширение ширины текстового поля происходит в блоке завершения без анимации, что для меня нормально, поскольку фон текстового поля скрыт, и пользователь видит только текст-заполнитель.
при этом исправленный код:
-(void)textFieldEditingPosition
{
NSLog(@"editing");
[_regular setNeedsUpdateConstraints];
switch (_activeTextField.tag)
{
case 1:{
self.textField2WidthConstraint.constant =_regular.frame.size.width/4 -16;
self.textField2XConstraint.constant = -_regular.frame.size.width/4 - self.textField2WidthConstraint.constant/2 -8;
self.textField2YConstraint.constant = -(_regular.frame.size.height/2 -_inputView.frame.size.height/2);
_textField1YConstraint.constant = 0;
_textField1XConstraint.constant = 0;
[UIView animateWithDuration:0.7
delay: 0.0
options: UIViewAnimationOptionBeginFromCurrentState
animations:^{
[self.regular layoutIfNeeded];
}
completion:^(BOOL finished){
self->_textField1WidthConstraint.constant = self->_placeHolderTextfield.frame.size.width;
[self.regular layoutIfNeeded];}];
}
break;
case 2:{
self.textField1XConstraint.constant = (_regular.frame.size.width /4) /2;
self.textField1YConstraint.constant = -(_regular.frame.size.height/8 -8) ;
self.textField1WidthConstraint.constant = _regular.frame.size.width/4 * 3 -16;
self.textField2YConstraint.constant =0;
self.textField2XConstraint.constant = 0;
[UIView animateWithDuration:0.7
delay: 0.0
options: UIViewAnimationOptionBeginFromCurrentState
animations:^{
[self.regular layoutIfNeeded];
}
completion:^(BOOL finished){
self->_textField2WidthConstraint.constant = self->_placeHolderTextfield.frame.size.width;
[self.regular layoutIfNeeded];}];
}
break;
default:
break;
}
}
Я уверен, что есть более чистый способ кодирования этого, но он работает, поэтому я испытываю облегчение
Спасибо