自定义导航标题偏移量 ios 11

Posted

技术标签:

【中文标题】自定义导航标题偏移量 ios 11【英文标题】:Custom Nav Title offset ios 11 【发布时间】:2017-09-20 22:49:39 【问题描述】:

我有一个自定义导航项标题,它只是两个标签,一个在另一个之上,从 .xib 文件加载。

它是通过调用这个来加载的:

class Utilities 
  /// Title and subtitle format custom title in Navigation bar.  Top and bottom text are centered on one another.
  ///
  /// - Parameters:
  ///   - navigationItem: The receiving controller's navigation item.
  ///   - titleText: Top text to be displayed a little larger and more bold.
  ///   - subtitleText: Bottom text to be displayed a little smaller and less bold.
  class func addCustomNavigationTitle(navigationItem: UINavigationItem, titleText: String, subtitleText: String) 
      let customNavigationTitleView =   LabelSubLabelCustomHeaderView.instanceFromNib() as! LabelSubLabelCustomHeaderView
      customNavigationTitleView.titleLabel.text = titleText
      customNavigationTitleView.dateLabel.text = subtitleText
      navigationItem.titleView = customNavigationTitleView
  
  ...

定义如下:

class LabelSubLabelCustomHeaderView: UIView 
  @IBOutlet var titleLabel: UILabel!
  @IBOutlet var dateLabel: UILabel!

  class func instanceFromNib() -> UIView 
      return UINib(nibName: "LabelSubLabelCustomHeaderView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
  

现在,它被精确地下推了 22 个像素,从而隐藏了底部标签。

我必须在 viewDidAppear 中设置该视图的框架,以便将其设置为直线。我尝试了 viewWillAppear 和其他一些东西。我真的不得不隐藏它,设置它,然后显示它,这显然是不对的。

ios 11 之前,这没有问题。

现在就是这样,没有我的 hack 修复,我希望我能做对:

下面是它的外观、iOS 10 之前的外观以及我的 hack 修复后的外观:

另外请注意,当展开转场动画时,视图会返回到错误的帧,即 22 像素太低。 我该如何解决这个问题?提前感谢您的帮助。

编辑:更详细的约束信息:

【问题讨论】:

我相信错误/解决方案将在您的布局约束中,您是否有机会展示您迄今为止定义的内容? 谢谢。这就是为什么我放了显示约束的屏幕截图,但我可以继续显示更详细的屏幕截图...我想我会编辑原始帖子... 好的,我放更多截图。请注意,这是从 .xib 加载并设置为导航项自定义标题视图。我不知道如何在加载的视图上设置约束,或者这是否可能。我认为导航项为我做到了。无论如何,它在 iOS 11 之前的当前限制条件下运行良好。 据我所知,您的 titleView 没有任何高度约束,似乎没有约束来确保“Label Sub Label Custom Header”的底部低于或等于“日期标签”。我相信如果您在标题视图上启用剪辑,这可能会变得很明显,您的日期标签可能刚好在标题视图的边界之外并且仍然可见,因为它没有被剪辑。 嗯,是的,这就是正在发生的事情。这在我的“hack fix”中得到了证明,我基本上将视图强制提高了 22 像素。特殊之处在于,在 iOS 11 之前我对此完全没有问题。如果这是一个约束问题,我如何为从 nib 加载的视图设置约束?该视图在 nib 文件本身中没有任何超级视图。我很难相信我需要手动编程约束并将它们添加到约束数组(将其约束到导航栏内容视图),除非这是我错过的 iOS 11 中引入的已知事物。 【参考方案1】:

您应该在自定义视图标题 Xib 中添加一个布局约束,强制在较低标签与视图安全区域之间保持最小距离。有关 iOS 10/11 的完整工作示例,请参阅 https://github.com/ekscrypto/Swift-Tutorial-Custom-Title-View

【讨论】:

感谢您的帮助和示例项目。非常感激。我现在有另一个问题,您的示例项目也许您可以提供帮助。我将开始一个新线程。请参阅即将发​​布的链接。 我尝试检查您的项目,以便推送更改,但它们很简单。我添加了一个按钮来推动一个新的视图控制器。 ***.com/questions/46415168/… 它在 iOS 11 上运行良好,但在 iOS 10 之前运行良好。

以上是关于自定义导航标题偏移量 ios 11的主要内容,如果未能解决你的问题,请参考以下文章

自定义大小的表格视图仍然使用导航栏的偏移量

iOS 11.2 自定义导航栏无限循环

iOS 11 导航栏高度自定义

ios11 Swift 自定义导航条上移20点解决方法

ios 11 自定义导航栏位于状态栏下方

iOS 11 在导航栏中自定义搜索栏