我仍然希望能够帮助解决这个问题所以我现在要稍微改进一下我的问题,因为我已经把它缩小了.
我的UIViewController层次结构如下所示:
如果用户触摸过滤器图标并选择提升类型,则会显示过滤器视图.左侧的图像是未选择过滤器的样子,右侧图像是选择过滤器时的样子.导航区域(以绿色标出)是我想要的风格.
这是我无法弄清楚的事情.如果我添加这两件事:
UINavigationBar.appearance().translucent = false UINavigationBar.appearance().barTintColor = UIColor(hexString: "232B35")
然后在导航区域和过滤器视图之间出现空白区域:
如果我将半透明属性设置为true,则不会出现该空格,但barTintColor无效.
请注意,我没有在我的UIViewController中放置UINavigationBar.我只有一个UINavigationItem,我正在添加代码.
在这一点上,我的问题是 – 当我在我的代码中使用UINavigationBar.appearance().translucent = false时,为什么大的空白区域突然出现(我可以做些什么来摆脱它,但仍然改变了我导航区的颜色)?
我真的被困住了,我会感激一些帮助.谢谢!
以下是我原来的问题,其中包含的信息可能有用,也可能没有帮助:
我正在尝试设计我的应用程序并且遇到困难时间.在一个UIViewController上,我有一个ThemeManager结构,其中包含一个将主题应用于应用程序的函数,并在该方法代码中使导航栏与应用程序的背景颜色融为一体:
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方法:
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,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() }
解决方法
然后你的第二个VC Top Bar应该从第一个VC推断.