2011-12-04 2 views
0

내가 만든이 간단한 사용자 정의 TUIScrollView 클래스 (TwUI 오픈 소스 프로젝트 및 UIScrollView와 매우 유사)에서 크기 조정 토글 애니메이션을 만들려고합니다. TUILayout이라고 불리우며 수직 레이아웃, 애니메이션 삽입 및 제거뿐 아니라 수평 레이아웃을 지원하며 위임보다 선호하는 셀에 데이터를 제공하는 데 더 많은 선언적 방법을 제공합니다. TUITableView 또는 UITableView와 유사한 뷰를 재사용합니다. 어쨌든 따라하고 싶다면, 그것은 단지 하나의 수업이고 여기에 있습니다.스크롤 뷰에서 애니메이션 크기 조절

https://github.com/mrjjwright/TUILayout.

예제 코드에서 사용자는 왼쪽 아래의 파란색 버튼을 클릭하고 모든 행은 사용자가 일부 행을 재정렬하고 삭제할 수있는 크기로 부드럽게 축소됩니다 (이 예에서 행을 마우스 오른쪽 버튼으로 클릭하면 액션) 등 ... 그리고 나서 사용자는 파란색 버튼을 다시 클릭하여 행을 다시 원래 크기로 토글합니다.

에서 크기를 조정하는 동안 먼저 행을 나타내는 모델 객체의 크기를 조정하고 TUIScrollView에서 contentSize를 다시 계산하고 설정 한 다음 모든 새보기를 순환합니다 (예 : 10 개의 뷰가 축소보기에 맞춰 짐) dequeueReusableView 및 addSubview가 10 번 호출 됨) 마지막으로 모든 뷰의 프레임을 layoutSubviews의 크기와 위치에 맞춰 애니메이션으로 만듭니다.

결과적으로 스크롤 막대가 스크롤 막대가 더 이상 표시되지 않는 크기로 정확하게 축소되고 화면에있는보기가 축소 된 크기로 부드럽게 애니메이션되지만 visibleRect에 적합하게 새로 추가 된 하위보기는 훨씬 나중에 하나의 하위 뷰로 간주됩니다.

새롭게 추가 된 모든 하위보기는 화면에 있던보기에 뒤쳐져서 애니메이션이 모두 함께 발생하지 않는 이유를 알 수 없습니다. 나는 CATransactions를 포함하여 운이없는 다양한 콤보를 많이 시도했다. CAScrollLayer가 어떻게 작동하는지 또는 누군가가 이것을 통해 나를 생각하도록 도울 수 있는지 궁금합니다.

좀 더 일반적인 문제는보기를 재생하는 스크롤보기에서 애니메이션 크기 조절을 부드럽게 처리하는 방법이며, iOS 세계에서 몇 가지 다른 표를보고 더 많은 영감을 얻었지만 더 많이 찾고 있습니다.

감사합니다.

답변

1

나는 내 자신의 문제를 여기에서 해결했을 수도 있다고 생각한다. (나는 오늘 아침에 침대를 만들어 내면서 나를 때렸다.) 나는 현재의 runloop을 필요한 모든 서브 뷰에서 순환시키고 매우 중요하게 실행 루프가 완료되고 애니메이션에 필요한 서브 뷰를 추가 할 때까지 scrollview의 contentSize를 설정하지 않고 실행하도록했습니다.

skipLayout = YES; 
[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]]; 
skipLayout = NO; 

skipLayout 경우는 추가 된 뷰는 즉시 재활용 레이아웃 코드에 의해 제거되지 않도록 TUILayout 그냥 layoutSubviews에서 반환 설정 : 내가 this SO question에서 트릭을 사용 화재 실행 루프를 얻기 위하여. 실행 루프를 실행하면 애니메이션의 모든 하위 뷰가 화면에 표시됩니다. 이 후 애니메이션 크기 조정 크기 조정을 수행했습니다. 누군가가 관심이 있다면 github에서 코드를 업데이트했습니다. 좀 더 깊은 통찰력을 얻으려면 잠시 동안이 질문을 열어 두겠습니다.

관련 문제