2016-10-27 2 views
0

내 테이블보기의 재사용 가능한 셀에 UISlider이 있습니다.
값이 변경되면 바로 사용자 정의 메서드 valueChanged()이 호출되어 테이블 뷰의 reloadData() 메서드를 트리거합니다. reloadData()cellForRowAtIndexPath이며, 슬라이더가 변경된 셀이로드되면 바로 두 개의 구속 조건이 적용되어 버튼이 셀 오른쪽에서 밀어 넣은 것처럼 보이게 만듭니다.

기본적으로 내가 만들려고하는 효과는 사용자가 슬라이드를 시작하자마자 애니메이션이 실행되고 버튼이 나타납니다.
여기에 catch가 있습니다. UISliderisContinious 속성이 true으로 설정되어 애니메이션이 즉시 발생하고 사용자가 슬라이더의 손가락을 가져갈 때까지 지연되지 않습니다. 그러나 isContinioustrue으로 설정하면 reloadData() (사용자 정의 valueChanged() 안에 있음)은 사용자가 커밋하는 모든 작은 슬라이드에서 많은 시간이 걸리게됩니다.

몇 가지 조사를하고 많은 디버깅 전술을 시도한 후에 이제 reloadData()이 호출되면 실행중인 애니메이션 (여전히 reloadData()이 호출 될 때 움직이는 애니메이션)이 중단되어 상태로 이동한다는 것을 알게되었습니다 애니메이션이 끝난 후에 있어야합니다.UITableView의 reloadData() 대신 사용할 수 있습니까?

그래서 시나리오 요약하자면 :
3) 애니메이션 레이아웃을 업데이트하기 시작

1) 슬라이더 이동,
2) valueChanged()reloadData() 트리거를
4) reloadData() 즉시 다시 단계에서 시작 애니메이션을 망치고 호출되는 3.

isContinioustrue으로 설정하면 모든 것이 너무 빠르게 진행되므로 애니메이션을 완료해야만 reloadData()이 다시 호출됩니다. 이 애니메이션을 폐허가 마치 UIView.animate(withDuration:) DOES 호출하고 작업을 정상적으로 수행하는 단추를 애니메이션없이 화면에 나타나는 것처럼 보이게합니다. reloadData()을 호출하지 않고 표를 새로 고치는 방법이 있는지 궁금 해서요.이 방법에 대한 대안은 기본적으로 (이미 시도했습니다. reloadCellAtIndexPath과 똑같은 효과가 있습니다). 그렇지 않다면 애니메이션이 다른 레이아웃 업데이트 방법에 의해 중단되지 않고 완료된다는 것을 절대적으로 확신 할 수있는 방법이 있습니까?

답변

0

문제가 생기면 새로 고침으로 애니메이션이 죽습니다. 애니메이션 실행이 끝날 때까지 reloadRowsAtIndexPaths 호출을 연기 할 수 있습니다. 일반적으로 애니메이션 블록의 완료 핸들러에서 호출하는 것이 좋지만 변경된 값이 하나 이상의 애니메이션을 실행하는 것처럼 보입니다. 대신 애니메이션을 시작할 때 재로드를 실행할 블록을 실행할 타이머를 시작하십시오. 새 애니메이션을 시작하면 이전 타이머를 무효화하고 새 타이머를 만듭니다. 재로드는 최종 애니메이션이 완료 될 때만 실행됩니다.

var timer = Timer() 

    func valueChanged() { 
     timer.invalidate() 
     timer = Timer.scheduledTimer(withTimeInterval: animationDuration, repeats: false) { _ in 
      //Call reload here 
     } 
     //Animate here 
    } 
+0

고마워요! 나는 타이머를 사용하지 않고 끝내지 만 애니메이션 블록에서 타이머를 트리거하면 애니메이션이 아직 실행 중인지 여부를 확인하는 사용자 정의 Boolean을 사용한다는 아이디어를 얻게됩니다. 나는 애니메이션이 완료된 후에 UIView의 animateWithDuration의 완성 블록이 호출되었다는 것을 몰랐다. 나는 항상 애니메이션이 시작된 직후에 호출되었다고 생각했고, 완성 블록 안의 Boolean 매개 변수는 애니메이션이 아직 실행 중인지 여부를 나타 냈습니다. –

+0

내가 알아 낸 후에는 애니메이션이 시작될 때 true로 설정되고 완료 블록에서 false로 설정된 부울 isAnimating Boolean을 만드는 것이 간단한 작업이었습니다. 애니메이션이 완료된 후입니다.매초마다 bazillion 번 호출되는 내 valueChanged 메서드에서 그냥 isAnimating false로 설정되어 있는지 확인하고 경우에만 reloadData() 코드를 실행하십시오. 매력처럼 작동합니다. 그래서 기본적으로, animateWithDuration의 완성 블록의 목적을 오해했기 때문에, 나는이 문제를 훨씬 더 복잡하게 만들었습니다. –

관련 문제