Анимация ширины рамки 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

  1. В вашем файле раскадровки или файла nib существует ограничение autolayout должно, чтобы разрешить изменение размера в левой части. В этом случае левый компонент со знаком находится в UIButton.

enter image description hereenter image description here


  1. Добавьте следующий код в качестве расширения или внутри вашего класса, чтобы выполнить анимированное изменение размера.
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)
 }

}