如何获取导航栏large title的左侧边距以对齐table view
实现Table View与导航栏大标题左对齐的方案
有两种常用实现方式,不需要硬编码间距数值,适配不同尺寸的设备:
方案1:使用系统可读内容指南适配(推荐)
导航栏大标题的默认leading边距与当前ViewController根视图的readableContentGuideleading边距完全一致,直接将Table View的左右边距和readableContentGuide绑定即可:
// Swift 代码示例 tableView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ tableView.topAnchor.constraint(equalTo: view.topAnchor), tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor), tableView.leadingAnchor.constraint(equalTo: view.readableContentGuide.leadingAnchor), tableView.trailingAnchor.constraint(equalTo: view.readableContentGuide.trailingAnchor) ])
如果是用frame布局,可以直接读取readableContentGuide的布局边距:
let leadingMargin = view.readableContentGuide.layoutFrame.minX tableView.contentInset = UIEdgeInsets(top: 0, left: leadingMargin, bottom: 0, right: 0) // 如果需要cell内容也对齐,同步设置cell的缩进 tableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
方案2:直接读取导航栏大标题的leading偏移
如果场景特殊需要精确获取大标题的实际边距,可以遍历导航栏子视图找到大标题UILabel后计算偏移:
// Swift 代码示例 func getLargeTitleLeadingMargin() -> CGFloat? { guard let navigationBar = navigationController?.navigationBar else { return nil } for subview in navigationBar.subviews { if let largeTitleLabel = subview.subviews.first(where: { $0 is UILabel }) as? UILabel { let labelFrameInRootView = largeTitleLabel.convert(largeTitleLabel.bounds, to: view) return labelFrameInRootView.minX } } return nil } // 调用时机需要在导航栏布局完成后,比如viewDidAppear或者viewDidLayoutSubviews中调用
注意:遍历子视图的方式依赖系统导航栏的内部视图结构,系统版本更新后可能失效,优先选择方案1。
内容的提问来源于stack exchange,提问作者firattamur
相关产品推荐
相关产品推荐

