我有一个带有SearchBar和搜索显示控制器的UITableViewController:
一切都是默认的。导航栏是半透明的。单击搜索栏时,导航栏会向上滑动。现在,当您关闭搜索时,它会重新滑入,这会在搜索和导航栏之间产生白色差距:
任何想法是什么导致了这个以及如何解决它?我使用的是swift,iOS8.1和xcode6.1
我唯一能做的就是将表格视图的视图背景设置为蓝色。但这会产生负面影响,当表视图为空时,所有内容都会变为蓝色。
答案 0 :(得分:5)
从the code you posted on GitHub我可以找到一种方法来避免差距,显然是动画计时问题。
在你的FirstTableViewController.swift中,你需要注册为UISearchBar的委托,然后在searchBar解散时(尽快文本编辑结束)使用委托方法searchBarTextDidEndEditing触发你自己出现的navigationBar:
这是你最后的swift文件,增加了2个:第3行的 UISearchBarDelegate ,最后是函数 searchBarTextDidEndEditing :
import UIKit
class FirstTableViewController: UITableViewController, UISearchBarDelegate {
var entries: NSArray = ["Foo", "Bar"];
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.entries.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.text = entries[indexPath.row] as? String
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
performSegueWithIdentifier("test", sender: nil)
}
// Fix searchbar disappear bug
func searchDisplayControllerDidEndSearch(controller: UISearchDisplayController) {
self.tableView.insertSubview(self.searchDisplayController!.searchBar, aboveSubview: self.tableView)
}
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
self.navigationController?.setNavigationBarHidden(false, animated: true)
}
}
编辑 - 通过调整IB中的正确布局选项,两个视图控制器都可以工作。
首先:TableViews的3个选中选项位于绘图:不透明+清除图形上下文+自动调整子视图
第二:对于ViewController本身,扩展边缘选中的选项是:在底栏+不透明条下
第三:上面关于UISearchBar代表团的代码......
答案 1 :(得分:3)
尝试将UISearchBar放在表视图之外,而不是作为子视图的子视图。这可能是一个小的设计变化,但动画要好得多。
答案 2 :(得分:2)
我相信"白色差距"是表视图控制器的背景颜色。我想您可以更改表视图控制器的背景颜色以匹配搜索栏或导航栏,但整个表视图控制器也将是该颜色。
答案 3 :(得分:2)
将搜索栏更改为灰色(即背景颜色)。它可以帮助您
答案 4 :(得分:2)
白色有导航控制器的背景颜色
故事板中的1)分配导航控制器的类并将其背景颜色设置为您想要的任何颜色...就像我在viewDidLoad()中所做的示例一样。
2)设置表视图的backgroundColor。默认情况下,它与底层导航控制器背景相同(在故事板中执行此操作正常)
class NavControllerViewController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
view.backgroundColor = UIColor.redColor()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
如果您想要与导航栏相同的颜色
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
view.backgroundColor = navigationBar.tintColor
}
答案 5 :(得分:2)
import UIKit
class NavControllerViewController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
view.tintColor = UIColor.redColor()
view.backgroundColor = view.tintColor
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
class FirstTableViewController: UITableViewController, UISearchBarDelegate {
var entries: NSArray = ["Foo", "Bar"];
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.entries.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.text = entries[indexPath.row] as? String
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
performSegueWithIdentifier("test", sender: nil)
}
}
class SecondTableViewController: UITableViewController, UISearchBarDelegate {
var entries: NSArray = ["Foo", "Bar"]
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.entries.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("cell2", forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.text = entries[indexPath.row] as? String
return cell
}
}
没有必要做任何特别的伎俩。正如我在第一个答案中写的那样,白色间隙只是NavigationController主视图的背景颜色。
这段代码对我有用,我现在将tintColor和backgroundColor设置为红色,向您展示后面会发生什么......
答案 6 :(得分:1)
statusBar颜色由 extendedLayoutIncludesOpaqueBars 属性引起。 默认情况下设置为“是”。将其设置为“否”,状态栏将始终具有相同的颜色。
希望它可以帮到你。
答案 7 :(得分:1)
根据您的问题,我创建了类似的示例演示,并得出结论,您在导航栏和搜索栏之间获得空白是因为您已设置搜索栏控制器而不是搜索栏。
我已经做了一些挖掘,并了解到它是搜索栏的默认行为。
在表格视图外使用搜索栏控制器时,还会在导航栏和搜索栏之间显示空格。
您需要在UItableView外部的UIView上使用UISearch Bar,而不是使用UISearchBarController。
使用动画隐藏和显示导航栏,您可以使用搜索栏以类似的方式显示和隐藏导航栏。
func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool {
UIView.animateWithDuration(0.3, animations: {
searchBar.showsCancelButton = true
self.navigationController?.navigationBarHidden = true
}, completion: { value in
//comment below lines is you want smooth animation.
self.navigationController!.navigationBar.alpha = 0
})
return true
}
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
UIView.animateWithDuration(0.3, animations: { () -> Void in
searchBar.showsCancelButton = false
searchBar.resignFirstResponder()
// Uncomment below line for smooth animation effect.
// self.navigationController!.navigationBarHidden = false
}, completion: { finished in
//comment below lines is you want smooth animation.
self.navigationController!.navigationBar.alpha = 1
self.navigationController!.navigationBarHidden = false
})
}
现在你不需要将背景颜色设置为导航栏颜色,当 searchBarCancelButtonClicked 时,墙壁没有像以前那样平滑的动画。
但这不像以前那样有流畅的动画。
因此,您可以将背景颜色设置为导航栏颜色。
希望这可以解决您的问题。