Анимация ширины рамки UISearchBar
Можно ли анимировать ширину кадра UISearchBar? Я нахожу, что когда я применяю анимацию uiview для расширения границ панели поиска, она появляется сразу до конечного результата, как если бы объект внутренне принимал контроль над тем, как он анимируется, и не позволяет мне применять мои собственные анимации к нему плавно.
Если я одушевляю позицию, в которой он движется плавно, но я подозреваю, что ввод текста в соответствии с наличием кнопки отмены может означать, что у нас нет открытого доступа к анимации ширины через анимацию UIView. Ниже приведен пример фрагмента ниже, чем у слайдов от x = 0 до 100, но ширина ширины до 600 пикселей.
CGRect searchBarFrame = self.searchViewController.searchBar.frame;
searchBarFrame.origin.x = 100;
searchBarFrame.size.width = 600;
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
self.searchViewController.searchBar.frame = searchBarFrame;
}
completion:^(BOOL completion){
}];
Ответы
Ответ 1
есть проблема с UISearchBar из-за внутренних представлений, заставляющих изменение размера игнорировать анимацию. Однако это можно преодолеть с помощью - layoutSubviews. Я включил код расширения и контракта в свой проект ниже
[UIView animateWithDuration:.3
animations:^ {
CGRect newBounds = locationSearch.frame;
newBounds.size.width += 215; //newBounds.size.width -= 215; to contract
locationSearch.frame = newBounds;
[locationSearch layoutSubviews];
}];
Надеюсь, что это поможет.
Ответ 2
FYI, вы можете использовать UIViewAnimationOption
вместо прямого вызова layoutsubviews
,
Таким образом, код будет выглядеть примерно так.
[UIView animateWithDuration:0.5
delay:0
options:UIViewAnimationOptionLayoutSubviews
animations:^{
//Set the frame you want to the search bar
}
completion:^(BOOL finished) {
}];
Ответ 3
Вот как преодолеть расширение только до левой стороны в быстро
(Этот код будет увеличивать/сжимать пиксели searchBar 93 над левой стороной при редактировании начала/конца пользователя)
- SharedNavigationbBar - это UIView, который реализует UISearchBarDelegate
- searchBarWidth - это выход к ограничению, содержащему ширину UISearchBar
- В вашем файле раскадровки или файла nib существует ограничение autolayout должно, чтобы разрешить изменение размера в левой части.
В этом случае левый компонент со знаком находится в UIButton.
![enter image description here]()
![enter image description here]()
- Добавьте следующий код в качестве расширения или внутри вашего класса, чтобы выполнить анимированное изменение размера.
extension SharedNavigationBar: UISearchBarDelegate
{
//amount of pixels to enlarge to the left
private var offsetSearchBarLeft:CGFloat
{
get {
return 93
}
}
///Enlarges search bar
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
self.animateSearchBar(self.searchBar, enlarge: true)
}
///Shrinks search bar
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
self.animateSearchBar(self.searchBar, enlarge: false)
}
//shrinks or enlarge the searchbar (this will be the function to call inside the animation)
private func animateSearchBar(searchBar:UISearchBar, enlarge:Bool)
{
///Important here, for this to work, the option and the searchbar size must be handled this way
UIView.animateWithDuration(0.3, delay: 0.0, options: UIViewAnimationOptions.LayoutSubviews, animations: { [weak self] () -> Void in
let multiplier: CGFloat = enlarge ? 1 : -1
let origin = searchBar.frame.origin.x + self!.offsetSearchBarLeft * multiplier
let width = searchBar.frame.width + self!.offsetSearchBarLeft * multiplier
//This Block of code, setting the new frame, needs to be inside the animation in order to work
var newBounds:CGRect = searchBar.frame;
newBounds.origin.x = origin
newBounds.size.width = width
//Sets the new frame
self?.searchBarWidth.constant = width
searchBar.frame = newBounds
}, completion: nil)
}
}