2016-08-25 4 views
1

Ich habe UITableView programmgesteuert erstellt. Ich verwende keine Storyboards. Ich lese und beobachtete Tonnen von Tutorials, wie man einen dehnbaren Header erstellt, aber alle verwenden Storyboards.Stretchy Header für eine programmatisch erstellte UITAbleView - Swift

Wie ich verstanden habe, müssen Sie TableViewHeader als Unteransicht hinzufügen und dann mit sendSubviewToBack nach hinten verschieben, um den dehnbaren Effekt zu erreichen. Dann wird der Rest der Logik angewendet.

aber ich kann nicht herausfinden, was an Unteransicht gesendet werden muss, wenn der Header programmgesteuert erstellt wird. Wenn Sie Storyboards verwenden, weisen Sie einer Variablen eine benutzerdefinierte Header-Klasse zu und fügen diese der Unteransicht hinzu. Also hier ist meine 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 
// } 

} 

Es ist nichts Besonderes. Hier ist der Code Probe ich versuche zu replizieren:

@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 

was in meinem Code von headerView:ArticleHeaderView! gleichwertig ist?

Es klingt vielleicht dumm, aber ich stecke fest. HILFE!

Antwort

3

Sie ein Beispiel hier sehen konnte:

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

Der Autor des Artikels spricht darüber, wie eine benutzerdefinierte Header-Ansicht erstellen und verwenden es Einschränkungen in Code und Anwenden der Transformation unter Verwendung von Delegierten der Scrollview mit von dem das UITableView erbt.

Er spricht über das Abwärts- und Aufwärtsscrollen, um den HeaderView kleiner oder größer zu machen.

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