Como animar de forma síncrona um UIView e um CALayer

Para ilustrar essa questão, eu criei um projeto Xcode muito pequeno no Github (duas classes, download de 11kb).Dê uma olhada na essência aqui ou usargit clone [email protected]: 93982af3b65d2151672e.git.

Por favor, considere o seguinte cenário. Uma visão customizada minha, chamada'vista de contêiner'contém dois pequenos quadrados. Ilustrado nesta captura de tela:

O quadrado azul é um 22x22 ptUIView instância e o quadrado vermelho é um pt 22x22CALayer instância. Para fins desta questão, quero que os dois quadrados se "colem" ao canto inferior direito da visão externa, enquanto eu animo o quadro dessa visão externa.

Eu mudo o quadro da visão do contêiner dentro de umUIViewmétodo de aulaanimateWithDuration:delay:options:animations:completion:, com um parâmetro de atenuação não padrão do tipoUIViewAnimationCurveEaseOut.

[UIView animateWithDuration:1.0 delay:0 
                    options:UIViewAnimationCurveEaseOut 
                 animations:^{ _containerView.frame = randomFrame; } 
                 completion:nil];

Nota: Tanto o quadro do UIView azul quanto o do vermelho são definidos nosetFrame: método da visualização do contêiner, mas os resultados teriam sido os mesmos se eu tivesse definido o UIView azulautoresizingMask propriedade para as margens esquerda e superior flexíveis do UIView.

Na animação resultante, o quadrado azul 'adere' ao canto do jeito que eu pretendia, mas o quadrado vermelho desconsidera completamente a sincronização e a suavização da animação. Eu suponho que isso é por causa do recurso de animação implícita do Core Animation, um recurso que me ajudou em muitas ocasiões antes.

Aqui estão alguns screenshots na seqüência de animação que ilustram a assincronia dos dois quadrados:

Para a pergunta:Existe uma maneira de sincronizar as duas alterações de quadro para que o CALayer vermelho e o UIView azul se movam com a mesma duração de animação e curva de atenuação, colando um ao outro como se fossem uma exibição?

P.S. É claro que o resultado visual exigido dos dois quadrados se unindo poderia ser alcançado de várias maneiras, por exemplo, tendo ambas as camadas se tornandoCALayers ouUIViews, mas o projeto de que a questão real está em causa tem uma causa muito legítima para um ser um CALayer e o outro para ser um UIView.

questionAnswers(2)

yourAnswerToTheQuestion