UIView animateWithDuration은 cornerRadius 변형을 애니메이션하지 않습니다.
나는의 변화 애니메이션려고 cornerRadius
의 UIView
인스턴스를 layer
,하지만의 변화는 cornerRadius
즉시 이루어집니다.
코드는 다음과 같습니다.
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)];
view.layer.masksToBounds = YES;
view.layer.cornerRadius = 10.0;
[UIView animateWithDuration:1.0 animations:^{
[view.layer.cornerRadius = 0.0;
}];
나에게 조언을 해주실 모든 분들께 감사드립니다.
편집하다:를 사용하여이 속성에 애니메이션을 적용 Core Animation
했습니다 CABasicAnimation
.
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"cornerRadius"];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animation.fromValue = [NSNumber numberWithFloat:10.0f];
animation.toValue = [NSNumber numberWithFloat:0.0f];
animation.duration = 1.0;
[viewToAnimate.layer addAnimation:animation forKey:@"cornerRadius"];
[animation.layer setCornerRadius:0.0];
tl; dr : 모서리 반경은에서 애니메이션 할 수 없습니다 animateWithDuration:animations:
.
문서에서보기 애니메이션에 대해 말하는 내용.
현상태대로 애니메이션 섹션 말한다 "iOS 용 프로그래밍 안내서보기"를의
UIKit과 Core Animation은 모두 애니메이션을 지원하지만 각 기술에서 제공하는 지원 수준은 다릅니다. UIKit에서 애니메이션은 UIView 객체를 사용하여 수행됩니다.
이전 버전을 사용하여 애니메이션 할 수 있는 속성 의 전체 목록
[UIView beginAnimations:context:];
[UIView setAnimationDuration:];
// Change properties here...
[UIView commitAnimations];
또는 최신
[UIView animateWithDuration:animations:];
(사용중인)은 다음과 같습니다.
- 틀
- 범위
- 센터
- transform (CATransform3D가 아닌 CGAffineTransform)
- 알파
- 배경색
- contentStretch
보시다시피이 cornerRadius
목록에 없습니다.
약간의 혼란
UIView 애니메이션은 실제로 애니메이션 뷰 속성에만 사용됩니다. 사람들을 혼란스럽게하는 것은 UIView 애니메이션 블록 내부의 레이어에서 동일한 속성, 즉 프레임, 경계, 위치, 불투명도, backgroundColor를 애니메이션 할 수도 있다는 것입니다. 그래서 사람들은 내부에서 레이어 애니메이션을 animateWithDuration
보고 거기에있는 모든 뷰 속성에 애니메이션을 적용 할 수 있다고 믿습니다.
같은 섹션에서 다음과 같이 말합니다.
보다 정교한 애니메이션을 수행하거나 UIView 클래스에서 지원하지 않는 애니메이션을 수행하려는 곳에서는 Core Animation과 뷰의 기본 레이어를 사용하여 애니메이션을 만들 수 있습니다. 보기와 레이어 개체는 서로 복잡하게 연결되어 있기 때문에보기의 레이어를 변경하면보기 자체에 영향을줍니다.
몇 줄 아래에있는 Core Animation 애니메이션 가능 속성 목록을 읽을 수 있습니다.
- 레이어의 테두리 (레이어의 모서리가 둥글는지 여부 포함)
그래서 애니메이션하기 위해 cornerRadius
당신이 필요로 이미 업데이트 된 질문 (과 답변)에 말했듯이 코어 애니메이션을 사용합니다. 나는 그 이유를 설명하려고 덧붙였다.
추가 설명
사람들 animateWithDuration
이 권장되는 애니메이션 방법 이라는 문서를 읽을 때 CABasicAnimation, CAAnimationGroup, CAKeyframeAnimation 등을 대체하려고한다고 믿기는 쉽지만 실제로는 그렇지 않습니다. 그것은 교체 beginAnimations:context:
하고 commitAnimations
당신은 위에서 볼 수있다.
이 확장을 사용하여 모서리 반경의 변화를 애니메이션합니다.
extension UIView
{
func addCornerRadiusAnimation(from: CGFloat, to: CGFloat, duration: CFTimeInterval)
{
let animation = CABasicAnimation(keyPath:"cornerRadius")
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
animation.fromValue = from
animation.toValue = to
animation.duration = duration
layer.add(animation, forKey: "cornerRadius")
layer.cornerRadius = to
}
}
모서리 반경 변형을 애니메이션 할 수 있지만 그렇게하는 유일한 방법은 CABasicAnimation을 사용하는 것입니다. 이것이 누군가를 돕기를 바랍니다.
다음과 같이 UIView 애니메이션을 구현할 수 있습니다. http://maniacdev.com/2013/02/ios-uiview-category-allowing-you-to-set-up-customizable-animation-properties
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"cornerRadius"];
animation.duration = DURATION;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animation.toValue = @(NEW_CORNER_RADIUS);
animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;
[view.layer addAnimation:animation forKey:@"setCornerRadius:"];
iOS 10 부터 실제로 cornerRadius를 애니메이션 할 수 있습니다.
UIViewPropertyAnimator(duration: 3.0, curve: .easeIn) {
square.layer.cornerRadius = 20
}.startAnimation()
애니메이션 가능한 속성 중 하나 인 것 같지 않습니다.
전체 목록은 여기를 참조하십시오.
You can make this property animatable in +[UIView animateWithDuration:]
by implementing -[actionForLayer:forKey]
in your view class. See this question for an example of how.
CornerRadius property is animatable
working code is below
//layer init
let imageLayer = CALayer()
imageLayer.frame = CGRect(x: 0, y: 0.0, width: tenPercent, height: tenPercent)
imageLayer.contents = imageNew.cgImage
imageLayer.masksToBounds = true
// animation init
let animationCornerRadius = CABasicAnimation(keyPath: "cornerRadius")
animationCornerRadius.beginTime = 0.01
animationCornerRadius.duration = CFTimeInterval(5)
animationCornerRadius.fromValue = 1
animationCornerRadius.toValue = tenPercent / 2
animationCornerRadius.fillMode = .forwards
animationCornerRadius.isRemovedOnCompletion = false
imageLayer.add(animationCornerRadius , forKey: "cornerRadius")
'Programing' 카테고리의 다른 글
Java를 사용하여 디렉토리의 파일 수 계산 (0) | 2020.11.30 |
---|---|
변수가 클래스의 인스턴스인지 어떻게 확인합니까? (0) | 2020.11.30 |
Visual Studio 2010에서 웹 배포-웹 관리 서비스가 없습니다. (0) | 2020.11.30 |
전체 DIV 주위에 CSS 상자 그림자 추가 (0) | 2020.11.30 |
Visual Studio 빌드가 매우 느림 (0) | 2020.11.30 |