핵심 그래픽 도면이있는 핵심 애니메이션
-
22-07-2019 - |
문제
UIView 하위 클래스 안에 있습니다 (아래 코드의 CustomView).
UIIMAGEVIEW 서브 클래스 (continerView)의 이미지 주위에 테두리를 그립니다. 이에 대한 핵심 그래픽 코드는 내부에 있습니다 drawInRect:
서브 클래스에서.
핵심 애니메이션 전환은 플립이지만, 그려지면 핵심 그래픽 코드가 사용되지 않습니다. drawInRect:
Calayer에게 내 렌더링 된 이미지를 제공하도록 호출되지 않았습니다.
대신 코어 그래픽 도면이 발생하지 않고 한 이미지에서 다른 이미지로 애니메이션을 얻습니다.
Calayer가 원시 이미지 대신 코어 그래픽 도면을 사용하여 애니메이션을 허용하는 방법은 무엇입니까?
[CustomView beginAnimations:@"transitionNextImage" context:nil];
[CustomView setAnimationDuration:2.0];
[containerView setImage:image];
[CustomView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
[containerView setImage:differentImage];
[CustomView commitAnimations];
해결책
당신은 구현 중입니다 drawRect:
, 아니다 drawInRect:
, 오른쪽? 또한이 전환 이외의 상황에서 실제로 작동하는지 확인 했습니까?
당신은 당신의 붙여 넣을 수 있습니까? drawRect:
구현? uiimageview가 의존하는 대신 층의 내용을 직접 설정하는 것이 두렵습니다. drawRect:
그것을하기 위해, 그것은 당신의 의미입니다 drawRect:
작동하지 않습니다.
사실, 이것이 실제로 얼마나 간단한지를 감안할 때 uiimageview 대신 uiview 서브 클래스 만 권장합니다. 도면의 이미지를 스케일링 할 때 종횡비를 보존하는 수학은 매우 간단합니다.
또 다른 옵션은 물론 UIIMAGEVIEW를 서브 클래스하고 그냥 무시하는 것입니다. setImage:
첫 번째를 기반으로 새 이미지를 만들지 만 그 주위에 테두리를 그리는 다음 슈퍼로 전달합니다. 그렇게하면 아무것도 할 필요가 없습니다 drawRect:
조금도.
다른 팁
네 그래 제가 구현하고있었습니다 drawRect:
, 그리고 네, 내 그림은 전환 밖에서 작동했습니다.
문제는 그 것입니다 drawRect:
내부 a UIImageView
Calayer가 그림을 위해 서브 클래스를 불러 내지 않았습니다.
그래서이 서브 클래스의 부모를 UIView
, 이미지에 대한 내 자신의 속성을 구현하고 애니메이션도 조정했습니다.
애니메이션 containerView
위의 코드에서 바닐라로 변경되었습니다. UIView
사례. 이를 수용하기 위해 애니메이션 코드를 약간 변경해야했습니다.
[CustomView beginAnimations:@"transitionNextImage" context:nil];
[CustomView setAnimationDuration:2.0];
[containerView addSubview:aViewSubclass];
[CustomView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
[aViewSubclass removeFromSuperview];
[containerView addSubview:anotherInstanceOfTheViewSubclass];
[CustomView commitAnimations];
즉, 이러한 종류의 전환에 대한 Apple의 문서에서 :
전환 중 뷰 모양을 변경하려면 (예를 들어, 한 뷰에서 다른 뷰로 뒤집기) 다음과 같이 컨테이너 뷰, uiview 인스턴스를 사용하십시오.
- 애니메이션 블록을 시작하십시오.
- 컨테이너 뷰에서 전환을 설정하십시오.
- 컨테이너 뷰에서 하위 뷰를 제거하십시오.
- 컨테이너 뷰에 새 하위 뷰를 추가하십시오.
- 애니메이션 블록을 커밋하십시오.