Programing

UIView animateWithDuration은 cornerRadius 변형을 애니메이션하지 않습니다.

lottogame 2020. 11. 30. 07:43
반응형

UIView animateWithDuration은 cornerRadius 변형을 애니메이션하지 않습니다.


나는의 변화 애니메이션려고 cornerRadiusUIView인스턴스를 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()

애니메이션 가능한 속성 중 하나 인 것 같지 않습니다.

전체 목록은 여기를 참조하십시오.

http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/AnimatingViews/AnimatingViews.html


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")

참고URL : https://stackoverflow.com/questions/5948167/uiview-animatewithduration-doesnt-animate-cornerradius-variation

반응형