2016-09-23 8 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)。そうであれば、ソースデータ配列の最後の要素からフッターを作成し、フッターの高さを他のセルと同じ高さに異なる背景色で設定します。

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

これを試験するために、のために...ループの範囲を変更します。もしそうでなければ、我々は、我々はそれに応じてセルをフォーマットその場合、データソースの最後の行であるかどうかをテストするためにcellForItemAtIndexPathを使用しますviewDidLoad from 0 .. < 5 to 0 .. < 50.これは、あなたが達成したいと思ったものと同じ動作をします。

希望に役立ちます!

関連する問題