【发布时间】:2016-08-29 04:57:18
【问题描述】:
更新 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 中,我故意通过情节提要放置了 UINavigationBar,但在第二个 VC 中我没有。我只在那个里面放了一个UINavigationItem。另请注意,第二个 VC 包含 UITableView,但它不是 UITableViewController。
如何在导航区域中获得我想要的纯色而不在其下方添加不需要的空间?
编辑 #1
这里再看UIViewController有问题:
请注意,层次结构是带有@IBOutlet 连接的UIView,下面是UIStackView,其中包含使用高度布局约束展开和折叠的过滤器视图(UIView)和UITableView。所以出现的大空白甚至不在我的层次结构中。
如果有帮助,这里是 Lift Log 的 UIViewController 中的 viewDidLoad 方法:
类 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()
}
【问题讨论】:
-
你的lift log vc是否包含TableView?
-
@Mr.UB,是的。看看我对我的问题所做的编辑,你会看到更多的细节。
标签: ios swift uiappearance