【问题标题】: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 个错误:“后缀的操作数!应该有可选类型”

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

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

【问题讨论】:

    标签: ios uitableview swift autolayout


    【解决方案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()
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-04-24
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多