2010-03-23 3 views
7

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

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

[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]; 

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

Любые догадки о том, почему это происходит, будут оценены!

Cheers, Aaron.

+0

Это лучше не для Macinsite! :> –

ответ

12

Я понял это благодаря этому сообщению: Changing the size of the UISearchBar TextField?

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

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

[UIView commitAnimations]; 

Подложки к Нику Фарине!

1

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

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

+0

Не работает для меня - iOS 5, iPhone 4S. –

+0

У меня была такая же проблема с UITextView. Это единственный ответ, который решил проблему для меня. – Fireandlight27

7

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

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

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

зафиксировал его.

+0

Этот вариант (и ваш ответ) очень приветствуется ... Спасибо – MiKL

3

Принятый ответ работает, но, согласно Apple, документы «не следует называть этот метод». Чистое решение заключается в использовании layoutIfNeeded метода:

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

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

    ... 

Enjoy!

+0

В этом ответе решена эта проблема. благодаря – Vinh