如何在swift中调整tableview标题的高度?

时间:2015-03-21 19:52:13

标签: ios uitableview swift autolayout

我有一个UITableViewController。此表视图具有标题视图。 我使用带有autolayout的main.storyboard来设置我的控制器。

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

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

main.storyboard

约束:

constraints

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

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

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

IPH5

对于iPhone 6:

IPH6

对于iPhone 6+:

IPH6+

  • 对于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

我有两个错误:"值可选类型CGFloat?没有打开"

如果我纠正

 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个错误:" postfix的操作数!应该有可选的类型"

是否可以直接调整故事板中的大小而不是以编程方式调整大小?

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

3 个答案:

答案 0 :(得分:3)

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

  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

答案 1 :(得分:3)

UITableView tableHeaderView没有纵横比选项,并且在InterfaceBuilder中限制了tableHeaderView的自动布局使用。有许多方法可以实现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 :(得分:0)

试试这个

    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()
    }
}