2016-08-25 121 views
1

我已經以編程方式創建了UITableView。我不使用故事板。 我閱讀並觀看了大量關於如何創建可伸縮標題的教程,但所有這些教程都使用了Storyboard。以編程方式創建的UITableView的伸縮標題 - Swift

據我所知,爲了實現有彈性的效果,您必須將tableViewHeader添加爲子視圖,然後使用.sendSubviewToBack將其移動到後面,然後應用其餘的邏輯。

但我不知道什麼必須發送到子視圖時編程創建標題。當使用故事板時,您將自定義標頭類分配給一個變量,然後將其添加到子視圖中。所以這裏是我的TableViewcontroller:

import UIKit 

private let reuseIdentifier = "contentCellId" 
private let headerIdentifier = "headerCellId" 

class ItemDetailViewController: UITableViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Uncomment the following line to preserve selection between presentations 
     // self.clearsSelectionOnViewWillAppear = false 

     tableView.registerClass(ItemDetailsContentCell.self, forCellReuseIdentifier: reuseIdentifier) 
     tableView.registerClass(ItemDetailsHeaderCell.self, forHeaderFooterViewReuseIdentifier: headerIdentifier) 

     let headerView = tableView.tableHeaderView 
     print(headerView) // returns NIL  

     tableView.separatorStyle = .None 

     // TableView heights 
     tableView.rowHeight = UITableViewAutomaticDimension 
     tableView.estimatedRowHeight = 500.0 

    } 

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

    // MARK: - Table view data source 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return 1 
    } 


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) as! ItemDetailsContentCell 

     // Configure the cell... 

     return cell 
    } 

    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
     let headerView = tableView.dequeueReusableHeaderFooterViewWithIdentifier(headerIdentifier) 
     return headerView 
    } 

    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
     let cell = tableView.dequeueReusableHeaderFooterViewWithIdentifier(headerIdentifier) as! ItemDetailsHeaderCell 

     let width = view.frame.width 
     let imageRatio = (cell.itemImage.image?.size.height)!/(cell.itemImage.image?.size.width)! 

     let newHeight = width * imageRatio 

     return newHeight 
    } 

// override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
//  return UITableViewAutomaticDimension 
// } 
//  
// override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
//  return 500 
// } 

} 

它沒什麼奇特的。 下面的代碼示例,我試圖複製:

@IBOutlet weak var tableView:UITableView! 
@IBOutlet weak var headerView:ArticleHeaderView! 

var article: Article? 

// Header view configuration 
private var defaultTableHeaderHeight:CGFloat = 250.0 
private var lastContentOffset:CGFloat = 0.0 
private let defaultHeaderImageName = "bg-pattern" 


override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.separatorStyle = .None 
    tableView.rowHeight = UITableViewAutomaticDimension 

    // Add the header view to the table view background 
    defaultTableHeaderHeight = headerView.frame.size.height 
    lastContentOffset = -defaultTableHeaderHeight 

    print(defaultTableHeaderHeight) 
    print(tableView.tableHeaderView!.frame.height) 


    tableView.tableHeaderView = nil 
    tableView.addSubview(headerView) 
    tableView.sendSubviewToBack(headerView) 

    tableView.contentInset = UIEdgeInsets(top: defaultTableHeaderHeight, left: 0, bottom: 0, right: 0) 
    tableView.contentOffset = CGPoint(x: 0, y: -defaultTableHeaderHeight) 

    // Disable content inset adjustment 
    self.automaticallyAdjustsScrollViewInsets = false 

什麼是等同的在我的代碼headerView:ArticleHeaderView!

這可能聽起來很愚蠢,但我卡住了。幫幫我!

回答

3

你可以在這裏看到一個例子:

https://medium.com/@jeremysh/creating-a-sticky-header-for-a-uitableview-40af71653b55

有關如何創建一個自定義頁眉查看和使用它的約束代碼和應用使用了滾動的代表改造使用文章談到的作者UITableView從中繼承而來。

他談到向下滾動和向上滾動使headerView變小或變大。

func animateHeader() { 
     self.headerHeightConstraint.constant = 150 
     UIView.animateWithDuration(0.4, delay: 0.0, 
     usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5, 
     options: .CurveEaseInOut, animations: { 
    self.view.layoutIfNeeded() 
    }, completion: nil) 
    } 

    func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
if self.headerHeightConstraint.constant > 150 { 
animateHeader() 
} 
} 
func scrollViewDidEndDecelerating(scrollView: UIScrollView) { 
if self.headerHeightConstraint.constant > 150 { 
animateHeader() 
} 
} 
相關問題