2017-01-30 5 views
5

보통 UITableView이 내 UIViewController에 있으며 전체 화면으로 제한됩니다. 이 tableView에는 사용자 정의 상호 작용 tableHeaderView이 있습니다. tableHeaderView는 크기면에서 동적이며 자체적으로 확장됩니다. headerView에는 textField가 있으며 textField에 포커스가 있는지 여부에 따라 자체 크기가 변경됩니다.UITableView의 애니메이션 중에 셀이 사라졌습니다.

tableHeaderView의 크기를 변경할 때 화면 맨 아래의 셀이 항상 올바르게 움직이는 것은 아닙니다. 내 애니메이션 블록 내에 layoutIfNeeded() 뒤에 tableView.beginUpdates()tableView.endUpdates()을 호출하려고합니다. 이 작업을 수행해야합니다. 그렇지 않으면 셀이 동적 크기를 전혀 따르지 않게됩니다.

나는이 gif를 만들었습니다. 애니메이션 중에 맨 아래의 셀을 자세히 살펴보십시오. 애니메이션을 상당히 느리게 만들었으므로 문제를 쉽게 볼 수 있습니다.

gif of problem

추측 다음있는 tableView 애니메이션이 시작 되 자마자 cellForRow:indexPath:을 요구하고, 어떻게 든 전체를 tableView 애니메이션 이후에있을 것입니다 상태 무엇인지 찾아 내고, 불필요한 세포를 제거하는 것이 날 것으로 보인다, 애니메이션이 아직 완료되지 않은 경우에도 마찬가지입니다. 마찬가지로 헤더를 축소 할 때 : 맨 아래에있는 셀은 이미로드 된 셀과 같은 방식으로 움직이지 않습니다. 그들은 다른 애니메이션으로 움직입니다.

왜 이런 일이 발생합니까? 예방할 수 있습니까?

편집 :

self.navigationController?.setNavigationBarHidden(isEditing, animated: true) 

var frame = tableHeaderView.frame 
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing) 

UIView.animate(withDuration: 0.3, animations: { 

    if isEditing{ 
     let point = CGPoint(x: 0, y: -self.topLayoutGuide.length) 
     self.tableView.setContentOffset(point, animated: false) 
    }  

    tableHeaderView.frame = frame 
    tableHeaderView.layoutIfNeeded() 
    self.view.layoutIfNeeded() 
    self.tableView.beginUpdates() 
    self.tableView.endUpdates() 
}) { [weak self](completed:Bool) in 
    //Do stuff 
} 
+2

코드를 표시 할 수 있습니까? – jalone

+0

스토리 보드에서 - 장면 선택 -> 속성 검사기 표시 -> 상단 막대 아래에서 상단 표시 줄 아래에서 해제하십시오. – Pavankumar

+0

@Sti : 일부 코드를 사용해야합니다. – Poles

답변

0

확인 애니메이션 코드, 내가 프로젝트를 참조하지 않기 때문에 나는 그것을 확인할 수 없지만, 내 버전을 제안하려고합니다. 나는 그것을 컴파일하려고하지 않았으므로 실수가있을 수 있습니다.

var navFrame = self.navigationController?.navigationBar.frame 
navFrame.origin.y = isEditing ? -navFrame.size.height : 0 

var frame = tableHeaderView.frame 
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing) 

UIView.animate(withDuration: 0.3, animations: { 
    if isEditing{ 
     let point = CGPoint(x: 0, y: -self.topLayoutGuide.length) 
     self.tableView.contentOffset = point 
    } 

    self.navigationController?.navigationBar.frame = navFrame 

    tableHeaderView.frame = frame 

    self.view.layoutIfNeeded() 
}) { [weak self](completed:Bool) in 
    //Do stuff 
} 
+0

감사합니다. 시도 할 시간이되면이 도구를 사용해 보겠습니다. 하나의 질문이지만, 왜 내가 수동으로 'self.navigationController? .setNavigationBarHidden (isEditing, animated : true)'를 사용하는 대신 navigationBar를 숨 깁니다. 문제가 그 문제와 관련 있다고 생각하십니까? – Sti

+0

@Sti 그래, 아마도 애니메이션 충돌. – jesse

0

난 그냥이 문제에 대해 다시 애플 개발자 기술 지원 팀 들었고, 여기에 자신의 응답이 그대로입니다 (강조 광산) :

안녕하세요 니콜라스,

을 주셔서 감사합니다 Apple 개발자 기술 지원 (DTS)에 문의하십시오.

설명하는 동작 및 결과 제한은 의도적으로 설계된 것입니다. 당신이 다른 방법 애플, 으로 고려되어야한다 생각되면

우리는 어떻게 디자인 결정에 영향을 에 당신을 정보가 포함 된 개선 요청을 제출하는 것이 좋습니다, 당신은 다른 일을보고 싶은 것.

동작이 변경 될 것이라는 약속은 없지만 결정에 대한 책임이있는 팀 팀에서 문제에 대한 생각을 확인하는 가장 좋은 방법입니다.

최고 감사합니다,

애플 개발자 기술 지원 우리가 단지 tableView.setContentOffset(_:animated:) 또는 tableView.scrollToRow(at:at:animated:) 하나에 간단한 전화를 사용하지 붙어있어 보인다

.

+0

어떻게 setContentOffset 또는 scrollToRow가이 문제를 해결할 수 있습니까? – Sti

+0

우리는 사용자 정의 애니메이션과 동기화 할 수없는 표준 메소드 호출을 사용하지 않고 있습니다. 따라서 팀에서 개선 요청을 제출할 것을 제안한 것입니다. 즉, 호출을 애니메이션 블록 외부에있는 해당 메소드 중 하나로 이동하여 "수정"할 수 있습니다. – gomollon