更新2: 我仍然希望能够得到一些关于此问题的帮助,因此我现在将问题进行了细化。
我的 UIViewController
层次结构如下图所示:
如果用户触摸筛选图标并选择升降机类型,则会出现筛选视图。左侧的图像是没有选择筛选器时的样子,右侧的图像是选择了筛选器后的样子。我正在尝试设置的是导航区域(用绿色方框标出)的样式。
这是我无法弄清楚的事情。如果我添加这两个内容:
UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barTintColor = UIColor(hexString: "232B35")
然后,在导航区域和筛选视图之间会出现一个空白的区域: 如果我将 translucent 属性设置为 true,则不会出现该白色空间,但是 barTintColor 将没有效果。
请注意,我没有在我的
UIViewController
中放置 UINavigationBar
。我只有一个使用代码添加的 UINavigationItem
。此时,我的问题是 - 为什么当我在代码中使用
UINavigationBar.appearance ().translucent = false
时,这个大的白色空间从哪里冒出来了(我该如何摆脱它,但是仍然改变我的导航区域的颜色)?我真的被卡住了,希望能得到一些帮助。谢谢!
以下是我原始的问题及信息,可能或可能不会有所帮助: 我正在尝试对我的应用进行样式设计,但是做得很困难。在一个
UIViewController
上,我有一个 ThemeManager 的 struct
,其中有一个应用主题的函数,在该方法中,可以让导航栏与应用的背景颜色融为一体:static func applyTheme(theme: Theme) {
// set the background color
sharedApplication.delegate?.window??.backgroundColor = UIColor(hexString: "232B35")
UINavigationBar.appearance().translucent = false // these are the offenders
UINavigationBar.appearance().barTintColor = UIColor(hexString: "232B35")
// first, set backgroundimage to nothing
UINavigationBar.appearance().setBackgroundImage(
UIImage(),
forBarPosition: .Any,
barMetrics: .Default)
// and also set shadowimage to nothing
UINavigationBar.appearance().shadowImage = UIImage()
UIStatusBarStyle.LightContent
UILabel.appearance().textColor = UIColor(hexString: "768DAA")
}
}
我的初始ViewController
看起来像我想要的 - 背景和导航组件颜色相同:
但在另一个视图控制器上,它有这个我不想要的大空间:
我已经发现是UINavigationBar.appearance().translucent
和UINavigationBar.appearance().barTintColor
属性导致了这种情况。好像它在实际导航区域下面添加了一个UINavigationBar
。如果我注释掉那段代码,当然就没有颜色了,但我不想要的大空间也消失了:
两个VC之间的最大区别是:在第一个VC中,我通过storyboard故意放置了一个UINavigationBar
,但在第二个VC中我没有。我只在那个VC中放置了一个UINavigationItem
。还要注意的是,第二个VC包含一个UITableView
,但它不是一个UITableViewController
。
如何在导航区域获得我想要的纯色,而不添加这个不需要的空间呢?
编辑#1
以下是存在问题的UIViewController
的另一种视图:
请注意,层次结构是具有@IBOutlet连接的UIView
,下面是包含过滤器视图(一个UIView
)的UIStackView
,该视图通过高度布局约束展开和折叠,以及一个UITableView
。因此,出现的大白色空间甚至不在我的层次结构中。
如果有帮助的话,这是Lift Log的UIViewController
中的viewDidLoad
方法:
class LiftLogViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate {
//MARK: IB outlets
@IBOutlet var tableView: UITableView!
@IBOutlet weak var navItem: UINavigationItem!
@IBOutlet weak var filterViewHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var clearFilterButton: UIImageView!
@IBOutlet weak var selectedFilter: UILabel!
@IBOutlet weak var clearButtonHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var clearButtonView: UIImageView!
let coreDataStack = CoreDataStack()
var liftEvents = [LiftEvent]()
var isFilterViewOpen = false
override func viewDidLoad() {
let doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: #selector(self.dismissLog(_:)))
let filterImage = UIImage(named: "filter_icon")
let filterButton = UIBarButtonItem(image: filterImage, style: .Plain, target: self, action: #selector(self.actionFilter))
self.navItem.rightBarButtonItems = [doneButton, filterButton]
let buttonTap = UITapGestureRecognizer(target: self, action: #selector(self.clearFilter))
clearFilterButton.addGestureRecognizer(buttonTap)
filterViewHeightConstraint.constant = 0.0
clearButtonHeightConstraint.constant = 0.0
super.viewDidLoad()
}