2016-09-23 56 views
1

如何在UITableView的底部放置“cellBOTTOM”?我想过使用表格视图页脚,但这会导致如果没有足够的单元格填充整个屏幕,页脚不会粘到屏幕的底部,而是在“cellLAST”的正下方。我需要将“cellBOTTOM”放在屏幕的底部并与桌子底部对齐在uitableview的底部放置一个单元格

+--------------------+ +--------------------+ +--------------------+ 
|  SCREEN  | |  SCREEN  | |  SCREEN  | 
| +----------------+ | | +----------------+ | | +----------------+ | 
| |  TABLE  | | | |  TABLE  | | | |  TABLE  | | 
| | +------------+ | | | | +------------+ | | | | +------------+ | | 
| | | cellLAST | | | | | | cell 1 | | | | | | cell 1 | | | 
| | +------------+ | | | | +------------+ | | | | +------------+ | | 
| |    | | | | +------------+ | | | | +------------+ | | 
| |    | | | | | cellLAST | | | | | | cell 2 | | | 
| |    | | | | +------------+ | | | | +------------+ | | 
| |    | | | |    | | | | +------------+ | | 
| |    | | | |    | | | | | cell 3 | | | 
| |    | | | |    | | | | +------------+ | | 
| | +------------+ | | | | +------------+ | | | | +------------+ | | 
| | | cellBOTTOM | | | | | | cellBOTTOM | | | | | | cell 4 | | | 
| | +------------+ | | | | +------------+ | | | | +------------+ | | 
| +----------------+ | | +----------------+ | | | +------------+ | | 
+--------------------+ +--------------------+ +-+ | cellLAST | +-+ 
                 | +------------+ | 
                 | +------------+ | 
                 | | cellBOTTOM | | 
                 | +------------+ | 
                 +----------------+ 
+0

您是否想过节页脚视图?不是表格页脚视图,它很好地包裹了你的部分 – Tj3n

+0

你想让底部单元格看起来像什么?它是标准单元格上的变体,还是完全不同的东西? – Sparky

+0

@Sparky它可以是两个。我不介意不使用单元格,也许只是在桌子外面使用uiview或其他东西。但我需要它的行为像我需要它 – WKL

回答

0

我在午餐时间里快速浏览了一遍。我原本虽然这可以通过重写ScrollViewDidScroll来完成,但无法以这种方式工作。我想出的答案是动态决定表是否应该显示页脚视图。

在下面的代码中(这很粗糙,但应该给出你的想法),我们测试表的行数是否大于我们想要在屏幕上显示的数量(在这种情况下,我已经硬编码了这个到10)。如果是,则我们从源数据数组的最后一个元素创建一个页脚,并将页脚高度设置为与其他单元格高度相同的高度,并使用不同的背景颜色。如果没有,那么我们用cellForItemAtIndexPath来测试我们是否在数据源的最后一排,在这种情况下,我们相应格式的单元格:

import UIKit 

class ViewController: UIViewController { 

    var myTrackingTableViewController : TrackingTableViewController! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let sourceData : [String] = { 
      var sD : [String] = [String]() 
      for count in 0..<50 {   // Use the top end of this loop to configure the number of rows in the tableview 
       sD.append("Number \(count)") 
      } 
      return sD 
     }() 

     myTrackingTableViewController = TrackingTableViewController(sourceData: sourceData, numberOfRowsOnScreen: 10, style: UITableViewStyle.plain) 

     self.view.addSubview(myTrackingTableViewController.tableView) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

class TrackingTableViewController : UITableViewController { 

    let sourceData : [String] 
    var footerText : String! 
    var footerInline : Bool = false 

    init(sourceData: [String], numberOfRowsOnScreen: Int, style: UITableViewStyle) { 
     self.sourceData = sourceData 
     super.init(style: style) 

     if self.sourceData.count > numberOfRowsOnScreen { 
      self.footerText = sourceData.last 
     } 
     else 
     { 
      footerInline = true 
     } 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if footerInline { 
      return sourceData.count 
     } 
     return sourceData.count - 1 
    } 

    override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { 
     if footerText != nil { 
      return self.tableView.frame.height/10 
     } 
     return 0 
} 

    override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { 
     if footerText != nil { 
      let cell = UITableViewCell() 
      cell.frame = CGRect(origin: CGPoint(x: 0, y: self.tableView.frame.height - self.tableView.rowHeight), size: CGSize(width: self.tableView.frame.width, height: self.tableView.frame.height/CGFloat(10))) 
      cell.backgroundColor = UIColor.red 

      let textLabel = UILabel(frame: CGRect(origin: CGPoint.zero, size: cell.frame.size)) 
      textLabel.text = footerText 

      cell.addSubview(textLabel) 

      return cell 
     } 
     return nil 
    } 

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     return self.tableView.frame.height/10 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell") ?? UITableViewCell() 

     // Clean 

     for subview in cell.subviews { 
      subview.removeFromSuperview() 
     } 

     // Configure 

     if indexPath.row == sourceData.count - 1 && footerInline { 
      cell.backgroundColor = UIColor.red 
     } 
     else 
     { 
      cell.backgroundColor = UIColor.blue 
     } 

     let textLabel = UILabel(frame: CGRect(origin: CGPoint.zero, size: cell.frame.size)) 
     textLabel.text = sourceData[indexPath.row] 

     cell.addSubview(textLabel) 

     return cell 
    } 
} 

要进行测试,改变为范围...循环in viewDidLoad from 0 .. < 5 to 0 .. < 50.你会看到行为符合你想达到的目的。

希望有帮助!

相关问题