我正在尝试模拟日历应用中的搜索栏并发现它令人惊讶地困难,尽管许多人已经在SO和其他地方提出了这个问题并且已经提供了许多半答案。 (我需要支持IOS 7)。
主要要求是
1)有一个搜索栏按钮。
2)按下上方按钮时,导航栏中会出现带取消的搜索栏。
要完成1)您只需在导航栏上放置一个条形按钮项目。没问题。
完成2)是困难的部分。
要使搜索栏显示在导航栏中,而不是您应该设置的其他位置
self.searchDisplayController.displaysSearchBarInNavigationBar= true
为here;
我可以让搜索栏出现在导航栏中但没有取消按钮。
显示取消按钮的代码应为:
self.searchDisplayController.searchBar.showsCancelButton = YES;
这与将搜索栏放在导航栏中无关。
最后,与searchDisplayController相反,称为搜索栏的东西有一个名为.hidden的属性。在拖动搜索栏并将displaycontroller搜索到视图后,我已为此创建了一个outlet属性,并尝试更改此选项但未成功。 (将其从true更改为false对输出没有明显影响。)
是否有人成功创建了此UX,可以描述在IOS 7.0中模拟日历应用中搜索栏所需的所有步骤?
答案 0 :(得分:3)
以下代码仅用于说明这个想法。如果要使用它,则必须根据需要进行调整,注意方向更改并添加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
}
}