Эмулировать панель поиска в приложении Календарь
Я пытаюсь эмулировать панель поиска в приложении "Календарь" и нахожу ее на удивление трудной, хотя многие люди задали этот вопрос в SO и в других местах, и было предложено много половинных ответов. (Мне нужно поддерживать IOS 7).
Основными требованиями являются
1) Есть кнопка поиска панели.
2) При нажатии вышеуказанной кнопки на панели навигации появляется панель поиска с отменой.
Для этого 1) вы просто помещаете элемент панели кнопок на панель навигации. Нет проблем.
Для достижения 2) это сложная часть.
Чтобы панель поиска отображалась на панели навигации, а не в другом месте, которое вы должны просто установить self.searchDisplayController.displaysSearchBarInNavigationBar= true
как здесь;
Я могу заставить строку поиска появляться в навигационной панели, но без кнопки отмены.
Код для отображения кнопки отмены должен быть:
self.searchDisplayController.searchBar.showsCancelButton = YES;
Это не работает в связи с размещением панели поиска в навигационной панели.
Наконец, в отличие от searchDisplayController, то, что называется панелью поиска, имеет свойство.hidden. После перетаскивания панели поиска и контроллера поиска в представление, я создал свойство розетки для этого и попытался изменить это безуспешно. (Изменение его с истинного на ложное не оказывает видимого влияния на результат.)
Есть ли кто-нибудь, кто успешно создал этот UX, который может описать все шаги, необходимые для эмуляции панели поиска в приложении календаря в IOS 7.0?
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
}
}