Анимация ширины рамки UISearchBar - PullRequest
11 голосов
/ 05 марта 2012

Можно ли анимировать ширину кадра 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){
                 }];

Ответы [ 3 ]

28 голосов
/ 22 марта 2012

есть проблема с 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];
                 }];

Надеюсь, это поможет.

15 голосов
/ 22 февраля 2013

К вашему сведению, вы можете использовать UIViewAnimationOption вместо явного вызова layoutsubviews, Таким образом, код будет выглядеть примерно так ...

[UIView animateWithDuration:0.5
                              delay:0
                            options:UIViewAnimationOptionLayoutSubviews
                         animations:^{
                             //Set the frame you want to the search bar
                         }
                         completion:^(BOOL finished) {

                         }];
0 голосов
/ 10 апреля 2015

Это как преодолеть увеличение только на сторону влево в swift

(Этот код будет увеличивать / уменьшать панель поиска 93 пикселей слева, когда пользователь начинает / заканчивает редактирование)


  1. SharedNavigationbBar - это UIView, который реализует UISearchBarDelegate
  2. searchBarWidth является выходом в ограничение, содержащее ширину UISearchBar

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

enter image description here enter 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)
 }

}
...