How to animate add UISearchBar on top of UINavigationBar

后端 未结 4 1155
傲寒
傲寒 2020-12-07 08:44

If I set the displaysSearchBarInNavigationBar = YES in viewDidLoad, the search bar will be in navigation bar when the view show up. But I want to s

4条回答
  •  盖世英雄少女心
    2020-12-07 09:18

    I think the basic idea would be to animate a fade-out of your existing navigation bar's items (leftBarButtonItem(s), titleView, rightBarButtonItem(s)), followed by an animated fade-in of your search bar after it is added as your navigationItem's title view. To revert, animate a fade-out of the search bar, followed by a replacement of your navigationBar's prior items.

    The searchBar in the rough example below is stand-alone, but it could also come from elsewhere, like iOS8's new UISearchController. It also assumes that the view controller is embedded in a UINavigationController.

    This example builds the UI programmatically, but you should be able to incorporate this approach with a Storyboard-built UI.

    The animation that occurs when the user taps the "Cancel" button is a little rough, but hopefully might point the way to a smoother solution.

    @interface ViewController() 
    
    @property (nonatomic, strong) UIButton *searchButton;
    @property (nonatomic, strong) UIBarButtonItem *searchItem;
    @property (nonatomic, strong) UISearchBar *searchBar;
    
    @end
    
    - (void)viewDidLoad {
    
        [super viewDidLoad];
    
        // create the magnifying glass button
        self.searchButton = [[UIButton alloc] init];
        // add button images, etc.
        [_searchButton addTarget:self action:@selector(searchButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
    
        self.searchItem = [[UIBarButtonItem alloc] initWithCustomView:_searchButton];
        self.navigationItem.rightBarButtonItem = _searchItem;
    
        self.searchBar = [[UISearchBar alloc] init];
        _searchBar.showsCancelButton = YES;
        _searchBar.delegate = self;
    
    }
    
    - (void)searchButtonTapped:(id)sender {
    
      [UIView animateWithDuration:0.5 animations:^{
        _searchButton.alpha = 0.0f;
    
      } completion:^(BOOL finished) {
    
        // remove the search button
        self.navigationItem.rightBarButtonItem = nil;
        // add the search bar (which will start out hidden).
        self.navigationItem.titleView = _searchBar;
        _searchBar.alpha = 0.0;
    
        [UIView animateWithDuration:0.5
                         animations:^{
                           _searchBar.alpha = 1.0;
                         } completion:^(BOOL finished) {
                           [_searchBar becomeFirstResponder];
                         }];
    
      }];
    }
    
    #pragma mark UISearchBarDelegate methods
    - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    
      [UIView animateWithDuration:0.5f animations:^{
        _searchBar.alpha = 0.0;
      } completion:^(BOOL finished) {
        self.navigationItem.titleView = nil;
        self.navigationItem.rightBarButtonItem = _searchItem;
        _searchButton.alpha = 0.0;  // set this *after* adding it back
        [UIView animateWithDuration:0.5f animations:^ {
            _searchButton.alpha = 1.0;
        }];
      }];
    
    }// called when cancel button pressed
    

提交回复
热议问题