UIView Animation анимирует положение, но не ширину - PullRequest
7 голосов
/ 23 марта 2010

Я пытаюсь преобразовать UISearchBar, как в Mobile Safari: коснитесь в поле поиска, и оно увеличивается, а поле местоположения уменьшается.

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

[UIView beginAnimations:@"searchGrowUp" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:0.5f];
[UIView setAnimationDelegate:self];

CGFloat findFieldWidth = findField.frame.size.width;
CGFloat urlFieldWidth = urlField.frame.size.width;
CGRect findFieldFrame = findField.frame;
CGRect urlFieldFrame = urlField.frame;

findFieldFrame.origin.x = findFieldFrame.origin.x - 150.0f;
findFieldFrame.size.width = findFieldWidth + 150.0f;
urlFieldFrame.size.width = urlFieldWidth - 150.0f;

urlField.frame = urlFieldFrame;
findField.frame = findFieldFrame;

[UIView commitAnimations];

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

Любые предположения о том, почему это происходитбудет признателен!

Ура, Аарон.

Ответы [ 4 ]

12 голосов
/ 24 марта 2010

Я понял это благодаря этому сообщению: Изменение размера текстового поля UISearchBar?

Оказывается, содержимое UISearchBar не изменяет размер должным образом вместе с внешним слоем. Поэтому вы должны вызвать -layoutSubviews: внутри блока анимации после того, как на панели поиска установлен кадр. Таким образом, блок заканчивается как:

[findField setFrame:CGRectMake(findField.bounds.origin.y, findField.bounds.origin.y, findFieldWidth, findField.bounds.size.height)];
[findField layoutSubviews];

[UIView commitAnimations];

Реквизит Ника Фарина!

7 голосов
/ 19 апреля 2012

У меня была такая же проблема при попытке анимировать ширину UISearchBar.

В iOS 4 и более поздних версиях я обнаружил, что использование UIViewAnimationOptionLayoutSubviews в качестве опции для

+[UIView animateWithDuration:delay:options:animations:completion:]

исправил.

3 голосов
/ 03 июля 2012

Принятый ответ работает, но согласно Apple Docs вы "не должны вызывать этот метод" . Чистым решением является использование layoutIfNeeded метода:

[UIView animateWithDuration:UINavigationControllerHideShowBarDuration
                      delay:0.f
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{

    [searchBar setFrame: ...
    [searchBar layoutIfNeeded];

    ...

Наслаждайтесь!

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

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

Чтобы решить мою проблему, я вызвал sizeToFit для подпредставления внутри блока анимации.

...