Эмуляция панели поиска в приложении Календарь

Я пытаюсь подражать строке поиска в приложении «Календарь» и нахожу это на удивление трудным, хотя многие люди задавали этот вопрос в SO и в других местах, и было предложено много половинных ответов. (Мне нужна поддержка IOS 7).

Основные требования:

1) Есть кнопка панели поиска.

2) При нажатии вышеуказанной кнопки на панели навигации появляется строка поиска с отменой.

Для выполнения 1) вы просто помещаете кнопку панели на панель навигации. Без проблем.

Выполнить 2) - самая сложная часть.

Чтобы панель поиска отображалась на панели навигации, а не где-либо еще, вы должны просто установить self.searchDisplayController.displaysSearchBarInNavigationBar= true как здесь;

Я могу заставить панель поиска отображаться на панели навигации, но без кнопки отмены.

Предполагается, что код для отображения кнопки отмены:

self.searchDisplayController.searchBar.showsCancelButton = YES;

Это не работает в сочетании с размещением панели поиска на панели навигации.

Наконец, в отличие от searchDisplayController, панель поиска имеет свойство .hidden. После перетаскивания панели поиска и displaycontroller поиска в представление я создал для этого свойство выхода и безуспешно пытался его изменить. (Изменение его с true на false не оказывает видимого влияния на результат.)

Есть ли кто-нибудь, кто успешно создал этот UX, кто может описать все шаги, необходимые для имитации панели поиска в приложении календаря в IOS 7.0?


person user1904273    schedule 06.01.2016    source источник
comment
Похоже, это дубликат вопроса, который вы задали 12 часов назад. . Чем это отличается? Почему бы не обновить предыдущий вопрос, если у вас есть дополнительные сведения?   -  person rmaddy    schedule 06.01.2016
comment
Это другое. Этот вопрос касался создания строки поиска в коде. Речь идет об эмуляции календаря. Фактическую панель поиска можно перетащить в раскадровку. Вопрос в том, как управлять им после создания в раскадровке.   -  person user1904273    schedule 06.01.2016
comment
FYI также используется в приложении Messenger.   -  person user1904273    schedule 06.01.2016


Ответы (1)


Следующий код предназначен только для иллюстрации идеи. Если вы хотите его использовать, вам нужно настроить его в соответствии с вашими потребностями, позаботиться об изменении ориентации и добавить tableView. Также есть константы, которые можно заменить на что-нибудь получше.

class ViewController: UIViewController, UISearchBarDelegate {
    let searchBar = UISearchBar()
    private var searchBarVisible = false

    override func viewDidLoad() {
        super.viewDidLoad()

        searchBar.showsCancelButton = true
        searchBar.delegate = self

        let height: CGFloat = 44
        let window = UIApplication.sharedApplication().keyWindow!
        self.searchBar.frame = CGRectMake(0, -height, window.frame.width, height)
    }

    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        self.dismissSearchBarAnimated(true)
    }

    func showSearchBarAnimated(animated: Bool) {
        if !searchBarVisible {
            let window = UIApplication.sharedApplication().keyWindow!
            window.addSubview(searchBar)
            searchBar.setNeedsLayout()
            let duration = animated ? 0.2 : 0 // 0 executes immediately
            self.searchBar.becomeFirstResponder()
            UIView.animateWithDuration(duration) { () -> Void in
                self.searchBar.frame = CGRectMake(0, 20, window.frame.width, self.searchBar.frame.height)
            }
            searchBarVisible = true
        }
    }

    func dismissSearchBarAnimated(animated: Bool) {
        let window = UIApplication.sharedApplication().keyWindow!
        let duration = animated ? 0.2 : 0 // 0 executes immediately
        self.searchBar.resignFirstResponder()
        UIView.animateWithDuration(duration,
            animations: { () -> Void in
                self.searchBar.frame = CGRectMake(0, -self.searchBar.frame.height, window.frame.width, self.searchBar.frame.height)
            }) {(completed) -> Void in
                self.searchBar.removeFromSuperview()
                self.searchBarVisible = false
        }
    }

    @IBAction func actionSearchButton(sender: AnyObject) {
        self.showSearchBarAnimated(true)
    }

    //MARK: - UISearchBarDelegate
    func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
        NSLog("Should search for '\(searchText)'.")
    }

    func searchBarCancelButtonClicked(searchBar: UISearchBar) {
        self.dismissSearchBarAnimated(true)
    }

    func positionForBar(bar: UIBarPositioning) -> UIBarPosition {
        return .TopAttached
    }
}
person Florian L.    schedule 12.01.2016