2014-07-23 6 views
8

Мне нужно изменить размер одной таблицы моего стола при нажатии. Как я могу это сделать? Кто-нибудь может мне помочь?Как изменить высоту одной ячейки при нажатии?

Мой класс вид контроллера:

class DayViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    @IBOutlet var daysWorkPointTable: UITableView 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var nipName = UINib(nibName: "daysWorkPointsCell", bundle: nil) 

     self.daysWorkPointTable.registerNib(nipName, forCellReuseIdentifier: "daysWorkCell") 
    } 

    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { 
     return 1 
    } 

    func tableView(tableView:UITableView!, heightForRowAtIndexPath indexPath:NSIndexPath) -> CGFloat { 
     return 75 
    } 

    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { 
     var cell = tableView.dequeueReusableCellWithIdentifier("daysWorkCell", forIndexPath: indexPath) as daysWorkPointsCell 

     return cell 
    } 

    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { 

    } 
} 

ответ

31

Сначала вы должны следить за indexPath от выбранной ячейки в свойстве:

var selectedCellIndexPath: NSIndexPath? 

Это должно быть необязательным, потому что вы можете иметь не выбрана ячейка. Следующие позволяет объявить высоту для выбранного и невыбранного состояния (изменить значение, что вы хотите):

let selectedCellHeight: CGFloat = 88.0 
let unselectedCellHeight: CGFloat = 44.0 

Теперь вы должны реализовать tableView(_:, heightForRowAtIndexPath:):

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    if selectedCellIndexPath == indexPath { 
     return selectedCellHeight 
    } 
    return unselectedCellHeight 
} 

Теперь в вашем методе tableView(_:, didSelectRowAtIndexPath:) вы должны проверить погода в выбранной строке или невыбранной строке было выполнено постукивание:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    if selectedCellIndexPath != nil && selectedCellIndexPath == indexPath { 
     selectedCellIndexPath = nil 
    } else { 
     selectedCellIndexPath = indexPath 
    } 

    tableView.beginUpdates() 
    tableView.endUpdates() 

    if selectedCellIndexPath != nil { 
     // This ensures, that the cell is fully visible once expanded 
     tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .None, animated: true) 
    } 
} 

beginUpdates() и endUpdates() звонки дают вам анимированное изменение высоты.

Если вы хотите изменить продолжительность анимации с изменением высоты, вы можете обернуть вызовы beginUpdates() и endUpdates() в блоке анимации UIView.animationWithDuration(...) и установить его на любое значение, которое вы хотите.

Вы можете проверить this sample project, который демонстрирует этот код в действии.

+0

Argh, просто прочитайте, что вы хотите, чтобы это работало только в одной ячейке. Моя реализация немного переборщила, потому что она работает для любого количества ячеек. –

+0

Я не могу присвоить значение выбранной причинеCellIndexPath в проверке, если объявлено let, поэтому я попытался изменить let в var, но продолжаю с причиной ошибки, я не могу назначить nil для NSIndexPath. Вы можете мне помочь? Что я делаю не так? –

+0

Я изменил назначения, чтобы явно назначить self.selectedCellIndexPath. Он должен работать, надеюсь,;). –