UISearchController неправильная анимация при прокрутке назад, а затем исчезает - PullRequest
0 голосов
/ 07 января 2019

Если коротко, у меня есть контроллер основного вида, у которого скрыта панель навигации, из контроллера навигации этого VC я нажимаю другой контроллер вида, у которого видна панель навигации. Затем я добавляю searchController в навигационный элемент, чтобы добавить панель поиска при прокрутке вниз. Все работает нормально, пока вы не проведете пальцем по экрану.

Панель навигации анимируется, покидая экран вместе с ВК, но панель поиска анимируется так, как будто она поднимается на место. Что еще хуже, если я отменю свайп, чтобы выскочить, весь SearchBar исчезнет, ​​и вместо этого появится черный вид (я думаю, что фон searchController теперь любой фон просмотра).

Я перепробовал все, это всего несколько строк кода, но я дергал себя за решение этой проблемы. Я знаю, что могу просто отключить свайп для всплывающего окна, но я не хочу этого (+ даже при повторном нажатии кнопки SearchBar таким же странным образом), и я не хочу добавлять панель поиска любым другим способом.

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

desc

- (void)viewDidLoad {
    [super viewDidLoad];
    self.definesPresentationContext = YES;
    [self.navigationController setNavigationBarHidden:NO];

    if (@available(iOS 11.0, *)) {
        self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
        _searchController.delegate = self;
        _searchController.searchResultsUpdater = self;
        _searchController.searchBar.placeholder = @"Search";
        self.navigationItem.searchController = _searchController;
        self.navigationItem.hidesSearchBarWhenScrolling = YES;
    }
}

Ответы [ 3 ]

0 голосов
/ 17 апреля 2019

Поместите строку поиска в представление заголовка элемента навигации вместо назначения UISearchController для UINavigationItem's searchController

заменить

navigationItem.searchController

с

navigationItem.titleView = searchController?.searchBar

ОБНОВЛЕННЫЙ ОТВЕТ:

Проблема связана с методом, используемым для сокрытия NavigationBar Есть разные способы скрыть NavigationBar

self.navigationController?.setNavigationBarHidden(false, animated: true)
self.navigationController?.navigationBar.isHidden = false
self.navigationController?.isNavigationBarHidden = false

И, кажется, вы использовали свойство setter only, чтобы скрыть MasterViewController

self.navigationController?.setNavigationBarHidden(true, animated: true)

Вместо этого используйте isNavigationBarHidden и для установки, и для получения.

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.isNavigationBarHidden = true
    }

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.navigationController?.isNavigationBarHidden = false
    }

А также удалить setNavigationBarHidden из DetailViewController

Ура!

0 голосов
/ 24 апреля 2019

Я попробовал ответы здесь, но ни один из них не сработал так, как я хотел. Следующее решение сработало для меня.

Для неправильной анимации я сделал следующее в viewController с панелью поиска:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    let containerView = transitionCoordinator?.containerView
    let currentPosition = self.navigationItem.searchController?.searchBar.superview?.frame.origin.x
    transitionCoordinator?.animateAlongsideTransition(in: containerView, animation: { (context) in
        if context.viewController(forKey: .to) is PreviousViewController {
            self.navigationItem.searchController?.searchBar.superview?.frame.origin.x = self.view.frame.size.width

        }

    }, completion: { (context) in
        self.navigationItem.searchController?.searchBar.superview?.frame.origin.x = currentPosition ?? 0
    })
}

Для исчезновения панели поиска я немного прокрутил tableView, что позволяет панели поиска появляться снова. Проблема в том, что searchBar полностью удален из своего superView. Но с этой крошечной «анимацией» прокрутки панель поиска снова возвращается. Не очень круто, но это сработало:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    //workaround for showing the searchbar again if popgesture was canceled
    var offset = self.tableView.contentOffset
    offset.y -= 0.5
    UIView.animate(withDuration: 0.05, animations: {
        self.tableView.setContentOffset(offset, animated: false)
    }, completion: {_ in
        offset.y += 0.5
        self.tableView.setContentOffset(offset, animated: false)
    })
}
0 голосов
/ 17 апреля 2019

Добавление дополнительных UISearchController является излишним, я считаю. Вы всегда можете добавить автономный UISearchbar к своему контроллеру представления через раскадровку или код и сделать свой контроллер представления хостинга панели поиска в качестве делегата этой панели поиска.

Примерно так:

    self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 0, NAVBAR_HEIGHT)];   
    self.searchBar.delegate = self;
    self.view.addSubView(self.searchBar);

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

...