2016-11-17 2 views
1

Доброе утро(Swift) Развернуть и Свернуть TableView клетки при постукивании

Я создал пользовательский TableViewCell, который внутри имеет CollectionViewCell и стрелку направления. Я смог заставить ячейку расширяться и сжиматься, но мне хотелось бы, чтобы я расширял одну ячейку, и я нажимаю на другую, которая была предыдущей. Пример. Если ячейка развернута и ячейка нажата, я хочу, чтобы ячейка сжималась, а ячейка расширялась в одно и то же время. Так что только одна ячейка может быть в своем расширенном состоянии в любой данный момент, изменяя стрелку таргетинга.

Пример:

Если Cella расширяется и cellB сливают, я хочу Cella сжиматься и cellB расширить в то же время. Так что только одна ячейка может находиться в расширенном состоянии в любой данный момент, изменяя стрелку цели.

Мой код:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 






    switch(selectedIndexPath) 
    { 

    case nil: 

     let cell = myTableView.cellForRow(at: indexPath) as! TableViewCell 
     cell.arrowImagem.image = UIImage(named:"content_arrow2") 
     selectedIndexPath = indexPath 



    default: 
     if selectedIndexPath! == indexPath 
     { 

      let cell = myTableView.cellForRow(at: indexPath) as! TableViewCell 
      cell.arrowImagem.image = UIImage(named:"content_arrow") 
      //cell.reloadInputViews() 
      selectedIndexPath = nil 

     } 


    } 

    self.myTableView.beginUpdates() 

    self.myTableView.reloadData() 


    //myTableView.reloadRows(at: [indexPath], with: .automatic) 

    self.myTableView.endUpdates() 

} 


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 





    let index = indexPath 

    if selectedIndexPath != nil{ 
     if(index == selectedIndexPath) 
     { 
      return 147 
     } 
     else{ 
      return 67 
     } 
    } 
    else 
    { 
     return 67 
    } 



} 
+0

К сожалению я не перевести само начало вопроса доброе утро I creat созданный пользовательский TableViewCell, внутри которого есть CollectionViewCell и направленная стрелка. Я смог сделать ячейку расширяющейся и разрушающейся, но мне хотелось бы, чтобы я расширял одну ячейку, и я нажимаю на другую, предшествующую коллапсу. Пример: Если ячейка развернута и ячейка перехвачена, я хочу, чтобы ячейка сжималась, а ячейка расширялась в одно и то же время. Так что только одна ячейка может быть в своем расширенном состоянии в любой данный момент, изменяя стрелку таргетинга. –

+2

Вы всегда можете отредактировать свой вопрос в любое время, если вам нужно исправить или добавить что-то. – Moritz

+1

Спасибо за информацию Eric :) –

ответ

0

Вы можете сделать это, но вы должны сделать некоторые кодирования. Прежде всего, обнаружите, когда выбрана строка (сохраняйте указательный путь выбранной строки в переменной). Когда строка выбрана, вы добавите путь указателя к новой выбранной строке и выбранной ранее (что у вас есть в переменной) в массив, который вы передаете в таблицуView reloadRows изнутри didSelectRowAt, эта функция заставит перерисовку две строки и функция heightForRowAt будут вызваны, чтобы получить высоту обеих строк, в heightForRowAt вы проверите текущую выбранную строку (помните ли вы упомянутую выше переменную?) и верните расширенную высоту для этого, тогда как для остальных вы возвращаете свернутую высоту. Вы должны получить нужный результат. Надеюсь, что это поможет.

+0

Спасибо Sergio, я попробую ваше решение –

+0

добро пожаловать! – Sergiob

+0

Спасибо Sergio за вашу идею, я построил функцию, которая решила мою проблему :) –

0

Вы можете реализовать большую часть функциональности в didSet обработчика:

var selectedIndexPath: IndexPath? { 
    didSet { 
     guard indexPath != oldValue else { 
      return 
     } 

     if let oldValue = oldValue { 
      let cell = myTableView.cellForRow(at: indexPath) as? TableViewCell 
      cell?.arrowImagem.image = UIImage(named:"content_arrow") 
     } 

     if let indexPath = indexPath { 
      let cell = myTableView.cellForRow(at: indexPath) as? TableViewCell 
      cell?.arrowImagem.image = UIImage(named:"content_arrow2") 
     } 

     let rowsToUpdate = [indexPath, oldValue].flatMap {$0} 

     self.myTableView.beginUpdates() 

     // I don't think you actually need to reload rows here but keeping your code here... 
     self.myTableView.reloadRows(at: rowsToUpdate, with: .automatic) 
     self.myTableView.endUpdates() 
    } 
} 

, а затем в вашем didSelect:

if indexPath == selectedIndexPath { 
    selectedIndexPath = nil 
} else { 
    selectedIndexPath = indexPath 
} 

(написано без тестирования)

Смежные вопросы