2009-12-14 3 views
5

가능한 중복 :
Can you animate a height change on a UITableViewCell when selected?애니메이션있는 UITableViewCell 높이

내가이 일을 올바른 방법을 알아낼하려고 인터넷 검색을 많이 해 봤는데

, 지금까지 나는 실종됐다.

내 자신의보기로 UITableViewCell 서브 클래딩하고 선택한 때 확장하고 다시 선택하면 축소 할 UITableViewCell 높이를 애니메이션 시도하고 있습니다. 이 테이블은 수천 개의 행을 포함 할 가능성이 있으므로 tableView의 heightForRowAtIndexPath를 재정의하고 싶지는 않습니다. 이상 적으로 한 번에 두 개 이상의 셀을 확장 할 수 있기를 원하지만 그다지 중요하지 않습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

는 heightForRowAtIndexPath보다 셀 높이를 지정하기위한 다른 메커니즘이 없다, 저스틴

답변

6

을 주셔서 감사합니다. 당신이 그 방법으로 확장 된 세포를 적절히 고려하지 않는 한, 다른 세포가 그 위에 흘러가거나 그 밑에 숨겨진 것을 발견하게 될 것입니다. heightForRowAtIndexPath를 설정하는 것을 잊어 버린 골치 아픈 코드에서 다른 셀이 그 위에 표시 될 것입니다.

수천 개의 행을 처리하므로 사용자가 셀을 재정렬 할 수 없다고 가정합니다.

사용자가 주어진 셀을 탭하면 확장 된 셀의 인덱스 경로를 저장할 수 있습니다. 그런 다음, heightForRowAtIndexPath은 다음과 같습니다 당신이 정말로 여러 항목을 선택하려면

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 

if ([indexPath isEqual:lastSelectedIndexPath]) 
{ 
    return 80; 
} 

else { 
    return 44; 
} 

} 

, 당신은 배열에 적절한 인덱스 경로를 저장하고 다음과 같이 그들을 위해 확인할 수 있습니다 :

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 

CGFloat cellHeight = 44; 

for (NSIndexPath *expandedIndexPath in expandedIndexPathsArray) 
{ 
    if ([indexPath compare:expandedIndexPath] == NSOrderedSame) 
    { 
     cellHeight = 80; 
     break; 
    } 
} 

return cellHeight; 

} 

에 애니메이션을 얻기 오른쪽을 보면 약간의 작업이 필요할 것입니다. 나는 잠시 동안이 특정 UI 아이디어를 가지고 놀았으며 앉아서 실제로 그렇게 할 수 없었습니다. 당신이 할 수있는 한가지는 그것의 뒤에 tableview를 업데이트하면서 움직이는 더미 뷰를 디스플레이하는 것입니다. 당신이 당신의 확장을 수용하기 위해 아래 세포의 움직임을 시뮬레이션하기 위해 셀 애니메이션을 사용할 수 있습니다로

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPathswithRowAnimation:(UITableViewRowAnimation)animation 

이에 대한 관심이 될 수 있습니다.

셀의 프레임을 모두 애니메이션하는 것을 허용 할 수없는 경우 새 높이가 설정되면 확장 된 데이터의 불투명도 애니메이션을 수행 할 수 있습니다.

힘든 일이지만 만약 당신이 그것을 작동하게한다면 나는 아주 멋지다고 확신합니다. 행운을 빕니다.

+1

감사합니다. Danilo, 저를 올바른 길로 시작했습니다. didSelectRowAtIndexPath 내에서 reloadRowsAtIndexPaths를 사용하여 작동 시키게되었습니다. 언급 한 것처럼 셀이 확장되어 있는지 확인하고 heightForRowAtIndexPath에 해당 높이를 설정합니다. 다시 한 번 감사드립니다! – Justin

+1

너무 쿨! 다행스럽게도 도움이 될만한 정보를 제공합니다. 그것이 효과가 있기를 바랍니다. 어쩌면 내가 마침내 나 자신에게 시도해 볼지도 모르겠다. –

+1

'[indexPath compare : expandedIndexPath] == NSOrderedSame'은'[indexPath isEqual : expandedIndexPath]'로 작성되어야합니다. – user102008