如何快速调整表格视图标题的高度?

Posted

技术标签:

【中文标题】如何快速调整表格视图标题的高度?【英文标题】:How to adjust the height of the header of a tableview in swift? 【发布时间】:2015-03-21 19:52:12 【问题描述】:

我有一个 UITableViewController。这个表视图有一个标题视图。 我使用带有自动布局的 main.storyboard 来设置我的控制器。

在我的 main.storyboard 中,对于 w:Any h:Any,我的视图控制器的预览设置为默认大小 600x600。在里面,我的标题视图设置为 600x200。

在我的标题视图中,我将 imageView 设置为 Aspect Fill 模式:

约束:

在资产中,我的图片有@2x 和@3x 大小。

header-image@2x.png -> 750x498 header-image@3x.png -> 1242x825

当我编译时,在我为 iPhone 5 获得的模拟器中:

对于 iPhone 6:

对于 iPhone 6+:

对于 iPhone 5,图像从状态栏下方开始。我不 明白为什么? 对于 iPhone 6 和 iPhone 6+,图像裁剪了我的表格视图的第一个单元格。并且图像的顶部不会随着视图的顶部调整。

我不知道如何将tableHeaderView的高度调整为我的图像的高度,因为这个高度取决于设备。

我试图以编程方式设置标题的框架,但徒劳无功:

 var frame:CGRect!
 frame.size.width = self.bgHeaderImageView.image?.size.width
 frame.size.height = self.bgHeaderImageView.image?.size.height
 self.tableView.tableHeaderView?.frame = frame

我收到 2 个错误:“Value optional type CGFloat? not unwrapped”

如果我用

纠正
 var frame:CGRect!
 frame.size.width = self.bgHeaderImageView.image?.size.width!
 frame.size.height = self.bgHeaderImageView.image?.size.height!
 self.tableView.tableHeaderView?.frame = frame

我有 2 个错误:“后缀的操作数!应该有可选类型”

是否可以直接调整情节提要中的大小而不是通过编程方式?

我可能在这里遗漏了一些东西......

【问题讨论】:

【参考方案1】:

UITableView tableHeaderView 没有纵横比选项,并且 tableHeaderView 的自动布局使用在 InterfaceBuilder 中受到限制。有很多方法可以实现tableHeaderView的动态高度。如果你想有一个基于标题图像比例的 tableHeaderView 高度,你可以使用:

let width = UIScreen.mainScreen().bounds.size.width
self.height = (width/640) * 209 //calculate new height
self.tableView.tableHeaderView?.frame.size = CGSize(width: self.tableView.tableHeaderView!.frame.size.width, height: self.height)

【讨论】:

【参考方案2】:

我找到了一个解决方案,它不是很干净,但它确实有效。

  var kTableHeaderHeight:CGFloat! //expected height of the header tableview

  var image: UIImage = UIImage(named: "my-image")!

  var frame:CGRect!=self.tableView.tableHeaderView?.frame
  if UIScreen.mainScreen().bounds.size.width <= 320  //iPhone 5 and less
      frame.size.width = 320
      frame.size.height = 212
    else  //iPhone 6 @2x and iPhone 6+ @3x
      frame.size.width = image.size.width
      frame.size.height = image.size.height
   
   self.tableView.tableHeaderView?.frame = frame

【讨论】:

感谢分享您的解决方案!你帮我解决了一个类似的问题,我想分享一下,以防其他人遇到它:我有一个 uisearchbar 和 uibuttons 而不是 uiimageView 作为背景,而 tableHeaderView (和 tableFooterView )的高度会很大并延伸到整个屏幕高度。我不敢相信 Interface Builder 没有可能解决这个问题,或者这个错误首先发生 - 对我来说,这似乎是 SDK 中的一个错误,并且在 viewDidLoad 中明确设置框架解决了它。 (ios 8.2 & XCode 6.2 & OS X 10.9.5) 这太可怕了。【参考方案3】:

试试这个

    self.edgesForExtendedLayout = UIRectEdge.None
    self.automaticallyAdjustsScrollViewInsets = false
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)

还有这个

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
    if section == 0
    
        return 1
    
    else
    
        return 40; // your other headers height value
    


func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
    if section == 0
    
        // Note CGFloat.min for swift
        // For Objective-c CGFLOAT_MIN
        let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFloat.min))
        return headerView
    
    else
     
        // Construct your other headers here 
        return UIView()
    

【讨论】:

以上是关于如何快速调整表格视图标题的高度?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UITableView 的高度调整为内容大小的高度?

异步图像下载和调整图像高度后如何更新表格视图单元格

调整视图的高度以包含表格视图的行数

从自定义表格视图单元格类加载时如何调整单元格的高度?

为表格视图的高度分配上限?

如何在使用 tableViews 自调整单元格时在运行时更改表格视图单元格高度?