2017-03-03 1 views
4

목표가 무엇인지, 현재 발생하고 있는지를 보여주는 테스트 프로젝트를 만들었습니다. 왼쪽에있는 gif는 끝 모양을 원하는대로 정확하게 보여줍니다. 전통적인 단일 뷰 계층 구조로 구성됩니다. 핑크색보기를 an embedded/contained view으로 설정해야합니다. 지금까지의 나의 시도는 단지 나를 오른쪽의 gif로 가져 갔다.본질적으로 크기 조정 된보기 나누기 애니메이션 포함

포함 된보기가 커지는 방식은 중요한 세부 사항입니다. 파란색 하위보기가 높이를 변경하고 모든 연결된 수직 제약으로 인해 전체 장치가 새로운 고유 크기를 갖습니다. 예상대로, 이것은 실제 앱의 단순화이지만 모든 중요한 비트가 있다고 생각합니다. As is: The inner parts of the contained view animate well, but the sibling view does not animate.

이상한 내가 볼 주요 것들

Ideal visual outcome: Smooth animation of both the contained view and it's siblings in the containing context :

  1. 노란색/오렌지색은 "기타"보기에서 모든 애니메이션되지 않습니다. 여기 Before and after the animation, the frame has the same origin

가 있습니다 : 여기에 표시된대로 프레임이 이전과 애니메이션 후 동일한 기원을했다, 비록

  • 분홍색은보기가 자신의 부분에 대해 잘 애니메이션입니다 포함하지만, 위치의 애니메이션입니다 오른쪽 gif의 스토리 보드. "상위"장면의 컨테이너보기와 "하위"장면의 상위보기는 모두 런타임 특성이 false로 설정된 translatesAutoresizingMaskIntoConstraints입니다.

    다음

    Xcode storyboard showing embedded view setup and constraints

    질문 : ** 나는 본질적으로 규모의 크기 변화를 가지고보기를 포함 할 때 영향을받는 모든 레이아웃 변경 (제대로) 애니메이션을 얻을 내 구성에 대한 변경해야합니다 무엇? **

    편집 : 는 질문을 게시 이후, 나는 매뉴얼보기 컨트롤러 봉쇄 전략을 시도, 그리고 궁극적으로에 대한 좋은 징조입니다 스토리 보드 기술에서와 같이 동일한 결과를 얻었다 시도 수동 삽입 플랫폼. 전체 계층 구조에서보기가 1 개 더 적었지만 차이가 나는 것 같지 않았습니다.

    편집 : 현상금 및 프로젝트 주의를 끌기 위해 100 포인트 현상금을 추가했습니다. 샘플 프로젝트를 this github repo에 업로드했습니다. 확인 해봐!

  • 답변

    1

    다음과 같이 InnerViewController에서 애니메이션 블록을 변경하면 트릭을 수행합니다.

    var isCollapsed = false { 
        didSet { 
         let factor:CGFloat = isCollapsed ? 1.5 : 0.66 
         let existing = innerViewHeightConstraint.constant 
         UIView.animate(withDuration: 1.0) { 
          self.innerViewHeightConstraint.constant = existing * factor 
          self.view.layoutIfNeeded() 
          self.parent?.view.layoutIfNeeded() 
         } 
        } 
    } 
    

    주요 차이점 대신 즉시 애니메이션의 시작 이전의 애니메이션의 일부 제약을 갱신 매립 뷰 컨트롤러 지시 self.parent?.view.layoutIfNeeded()이다.

    +0

    샘 감사합니다! 나는 이것을 버블 링 할 필요가 있었다. (실제 프로젝트에서는 몇 가지 레벨의 봉쇄가있다.) 이것을 UIVC 확장으로 래핑했습니다 :'func bubbleLayoutIfNeeded() { view.layoutIfNeeded() parent? .bubbleLayoutIfNeeded() } –

    관련 문제