2016-11-17 1 views
1

굿모닝(SWIFT) 확장 및 축소의 tableview 셀 탭

는 I 내부적 CollectionViewCell 및 방향 화살표를 가진 사용자 TableViewCell을 만들었다. 셀을 확장하고 접을 수있게 만들었지 만 하나의 셀을 확장하고 이전의 축소를 클릭하면됩니다. 예 : 셀이 펼쳐져 있고 셀을 탭하면 셀을 축소하고 동시에 셀을 확장하려고합니다. 그래서 주어진 순간에 오직 하나의 셀만 확장 된 상태가되어 타겟팅 화살표가 변경됩니다.

예 :

셀라가 확대되고 cellB가 도청 경우에, 나는 셀라 수축하고 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

미안 내가 beggining 번역 해달라고 질문 중 안녕하세요. 나는 creat 내부적으로 CollectionViewCell과 방향 화살표가있는 사용자 정의 TableViewCell. 셀을 확장하고 접을 수있게 만들었지 만 하나의 셀을 확장하고 이전 축소판을 클릭하면 좋아집니다. 예 : 셀을 확장하고 셀을 탭하면 셀을 축소하고 동시에 셀을 확장해야합니다. 그래서 주어진 순간에 오직 하나의 셀만 확장 된 상태가되어 타겟팅 화살표가 변경됩니다. –

+2

수정하거나 추가해야하는 경우 언제든지 질문을 편집 할 수 있습니다. – Moritz

+1

정보 에릭 주셔서 감사합니다 :) –

답변

0

당신은 그렇게 할 수 있지만, 당신은 몇 가지 코딩을 할 필요가있다. 우선 행이 선택 될 때를 감지합니다 (변수에서 선택된 행의 색인 경로 유지). 행을 선택하면 didSelectRowAt 내부에서 tableView reloadRows에 전달한 배열에 새 선택한 행과 이전에 선택한 행 (변수에 있음)의 인덱스 경로를 추가합니다.이 함수는 두 행과 heightForRowAt 함수가 호출되어 두 행의 높이를 얻습니다. heightForRowAt에서 현재 선택한 행을 확인하고 (앞서 언급 한 변수를 기억합니까?) 다른 행에 대해서는 확장 된 높이를 반환합니다. 접힌 높이를 반환합니다. 원하는 결과를 얻어야합니다. 희망이 도움이 될 것입니다.

+0

감사합니다 세르지오 나는 당신의 솔루션을 시도합니다 –

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

(테스트없이 작성)