반응형

[최종 수정일 : 2018.05.08]

원문 : https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html#//apple_ref/doc/uid/TP40004514-CH3-SW1

레이어 컨텐츠 애니메이션하기(Animating Layer Content)

코어 애니메이션에 의해 제공되는 인프라(infrastructure)를 사용하여 앱 레이어의 정교한 애니메이션을 쉽게 만들 수 있고, 해당 레이어를 소유한 모든 뷰를 확장할수 있습니다. 예제는 레이어의 영역(frame) 사각형의 크기 변경, 화면에서의 위치 변경, 회전 변환을 적용하거나, 불투명도를 변경하는 것을 포함하고 있습니다. 코어 애니메이션으로, 애니메이션을 시작하는 것은 속성을 변경하는 것 처럼 간단하지만 애니메이션을 만들고 애니메이션 매개변수를 명시적으로 설정할 수 있습니다.

고급 애니메이션 만들기에 대한 정보는, 고급 애니메이션 기술(Advanced Animation Tricks)을 보세요.

레이어 속성을 간단히 변경하여 애니메이션하기(Animating Simple Changes to a Layer’s Properties)

암시적으로 또는 필요한 경우 명시적으로 간단한 애니메이션을 수행할수 있습니다. 암시적 애니메이션은 수행할 애니메이션에 기본 시간과 애니메이션 속성을 사용하며, 명시적인 애니메이션의 경우에는 애니메이션 객체를 사용하여 이런 속성들을 직접 구성해줘야 합니다. 그래서 암시적인 애니메이션은 많은 코드 없이 변경하고자 하는 상황에 잘 어울리고 기본 시간으로(default timing) 잘 동작합니다.

간단한 애니메이션은 레이어의 속성을 변경하고 코어 애니메이션이 시간에 따라 애니메이션을 만들어줍니다. 레이어는 레이어에 볼수있는 모양(appearance)에 영향을주는 많은 속성을 정의합니다. 예를들어, 레이어의 불투명도를 1.0에서 0.0으로 변경하면 레이어는 페이드 아웃(fade out)되고 투명해 집니다.

중요
코어 애니메이션 인터페이스를 사용하여 레이어 기반(layer-backed) 의 뷰를 직접 애니메이션 할수 있지만, 그렇게 하기 위해서 종종 추가적인 단계가 필요합니다. 레이어 기반(layer-backed) 뷰와 함께 코어 애니메이션을 사용하는 방법에 대한 자세한 정보는 레이어 기반의 뷰 애니메이션하는 방법(How to Animate Layer-Backed Views)을 보세요.

암시적인 애니메이션을 시작(trigger)하려면, 레이어 객체의 속성들을 업데이트 하면 됩니다. 레이어 트리(layer tree)에서 레이어 객체를 수정할때, 변경사항은 이러한 객체들에 즉시 반영됩니다. 하지만, 레이어 객체에 보여지는 모습은 즉시 변경되지 않습니다. 대신 코어 애니메이션은 변경사항을 적용하기 위해 하나 이상의 암시적인 애니메이션을 생성하고 예약합니다. 따라서 [목록 3-1]과 같이 변경하면 코어 애니메이션은 애니메이션 객체를 만들고 다음 업데이트 주기에서 애니메이션을 시작하도록 예약합니다.

[목록 3-1] 암시적인 변경으로 애니메이션하기

theLayer.opacity = 0.0;

애니메이션 객체를 사용하여 동일한 변경을 수행하려면, CABasicAnimation 객체를 생성하고 그 객체를 사용하여 애니메이션 속성을 구성합니다. 레이어에 애니메이션을 추가하기 전에 애니메이션의 시작과 끝값을 설정하며, 기간을 변경하거나 다른 애니메이션 매개변수를 변경할 수 있습니다. [목록 3-2]에서 애니메이션 객체를 사용하여 레이어를 페이드 아웃(fade out)하는 방법을 보여줍니다. 객체를 생성할때, 애니메이션하려는 속성의 키 경로(key path)를 지정하고나서 애니메이션 매개변수를 설정합니다. 애니메이션을 실행하기 위해, 원하는 애니메이션을 레이어에 추가하기 위해 addAnimation: forKey:메소드를 사용합니다.

[목록 3-2] 명시적인 변경으로 애니메이션하기

CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeAnim.fromValue = [NSNumber numberWithFloat:1.0];
fadeAnim.toValue = [NSNumber numberWithFloat:0.0];
fadeAnim.duration = 1.0;
[theLayer addAnimation:fadeAnim forKey:@"opacity"];
 
// Change the actual data value in the layer to the final value.
theLayer.opacity = 0.0;

팁(Tip)
명시적인 애니메이션을 생성할때, 애니메이션 객체의 fromValue 속성에 항상 값을 지정하는 것이 좋습니다. 이 속성에 값을 지정하지 않으면, 코어 애니메이션은 레이어의 현재 값을 시작 값으로 사용합니다. 그 속성에 마지막 값으로 이미 업데이트 된 경우에 원하는 결과가 나오지 않을 수 있습니다.

레이어 객체들의 데이터 값을 업데이트하는 암시적인 애니메이션과 다르게, 명시적인 애니메이션은 레이어 트리에 있는 데이터를 수정하지 않습니다. 명시적인 애니메이션은 애니메이션만 제공합니다. 애니메이션이 끝나면 코어 애니메이션은 레이어로부터 애니메이션 객체를 제거하고 현재 데이터 값을 사용하여 레이어를 다시 그립니다. 명시적인 애니메이션으로 변경사항을 영구적으로 유지하고자 하는 경우에, 앞의 예제와 같이 레이어 속성을 반드시 업데이트해야 합니다.

암시적 그리고 명시적인 애니메이션은 일반적으로 현재 실행 루프 주기(run loop cycle)가 끝난후에 시작하고 현재 스레드는 에니메이션을 실행하기 위한 실행 루프(run loop)가 있어야 합니다. 여러개의 속성들을 변경하거나 레이어에 여러개의 애니메이션 객체를 추가하는 경우에, 이러한 모든 속성 변경 사항은 동시에 애니메이션됩니다. 예를들어, 두개의 애니메이션을 동시에 구성하여 화면 밖으로 이동하면서 레이어를 페이드(fade: 희미하게 하거나 또렷하게 하기) 시킬수 있습니다. 하지만, 특정 시간에 시작하도록 애니메이션 객체들을 구성할수 있습니다. 애니메이션 타이밍 수정에 대한 자세한 내용은 애니메이션의 타이밍 사용자정의하기(Customizing the Timing of an Animation)을 보세요.

키 프레임 애니메이션을 사용하여 레이어 속성 변경하기(Using a Keyframe Animation to Change Layer Properties)

속성 기반(property-based)의 애니메이션은 속성을 시작값에서 끝 값으로 변경하는 반면에, CAKeyframeAnimation 객체는 선형적(linear)이거나 아닐수도 있는 방법으로 목표 값을 설정하여 애니메이션 할 수 있습니다. 키 프레임 애니메이션은 목표 데이터 값과 각 값에 도달해야하는 시간의 집합으로 구성합니다. 가장 단순한 구성으로, 배열을 사용하여 값과 시간을 모두 지정합니다. 레이어 위치를 변경하는 것에 대해서, 경로에 따라 변경하도록 할 수 있습니다. 애니메이션 객체는 지정한 키 프레임을 가져와서 주어진 시간동안 하나의 값에서 다른 값으로 보간(interpolating)하여 애니메이션 합니다.

[그림 3-1]은 레이어의 위치(positions) 속성에 대해 5초간 애니메이션 하는 것을 보여줍니다. 위치는 경로를 따라 에니메이션되며, CGPathRef 데이터 타입을 사용하여 지정되었습니다. 애니메이션에 대한 코드는 [목록 3-3]에서 볼수 있습니다.

[그림 3-1] 레이어의 위치 속성에 5초간 키 프레임 에니메이션하기

동영상 재생


[목록 3-3]은 [그림 3-1]에서 사용하는 애니메이션을 구현하기 위해 사용된 코드를 보여줍니다. 예제에서 경로(path) 객체는 애니메이션의 각 프레임에 대한 레이어의 위치를 정의하는데 사용됩니다.

[목록 3-3] 바운스(bounce)되는 키프레임 애니메이션 만들기

// create a CGPath that implements two arcs (a bounce)
CGMutablePathRef thePath = CGPathCreateMutable();
CGPathMoveToPoint(thePath,NULL,74.0,74.0);
CGPathAddCurveToPoint(thePath,NULL,74.0,500.0,
                                   320.0,500.0,
                                   320.0,74.0);
CGPathAddCurveToPoint(thePath,NULL,320.0,500.0,
                                   566.0,500.0,
                                   566.0,74.0);
 
CAKeyframeAnimation * theAnimation;
 
// Create the animation object, specifying the position property as the key path.
theAnimation=[CAKeyframeAnimation animationWithKeyPath:@"position"];
theAnimation.path=thePath;
theAnimation.duration=5.0;
 
// Add the animation to the layer.
[theLayer addAnimation:theAnimation forKey:@"position"];

키 프레임 값 지정하기(Specifying Keyframe Values)

키 프레임 값은 키 프레임 애니메이션의 가장 중요한 부분 입니다. 이러한 값들은 실행하는 과정에서 애니메이션의 동작을 정의합니다. 키 프레임 값을 지정하는 중요한 방법은 객채의 배열이지만 CGPoint 데이터 타입(레이어의 anchorPoint와 position속성값 처럼)이 포함된 값이며, 대신에 CGPathRef데이터 타입을 지정할 수 있습니다.

값의 배열을 지정할때, 배열에 넣은 것은 속성에 필요한 데이터 타입에 따라 다릅니다. 배열에 객체들을 직접 추가할 수 있습니다. 하지만, 몇몇 객체들은 추가되기 전에 id 타입으로 형변환되야 하고, 모든 스칼라(scalar) 타입이나 구조체는 반드시 객체로 래핑(wrapped)되야 합니다. 예를들어:

  • CGRect(경계와 프레임 속성 처럼)을 가지는 속성이며, 각 사각형(rectangle)을 NSValue객체로 래핑(wrap)합니다.
  • 레이어의 변형(transform) 속성이며, 각각 [CATransform3D] 행렬을 NSValue 객체로 래핑(wrap)합니다. 이 속성에 애니메이션을 적용하면 키 프레임 애니메이션은 레이어에 각 변형 행렬을 차례대로 적용합니다.
  • borderColor 속성이며, 배열에 추가하기 전에 각 CGColorRef 데이터를 id 타입으로 만들어야 합니다.
  • CGFloat 값을 가지는 속성이며, 배열에 추가하기 전에 각 값을 NSNumber객체로 래핑(wrap)해야 합니다.
  • 레이어의 contents 속성을 애니메이션할때, [CGImageRef] 데이터 타입의 배열로 지정합니다.

CGPoint 데이터 타입을 가지는 속성에 대해, 포인트(points)(NSValue 객체로 래핑된)의 배열을 생성하거나 지정된 경로를 따르는CGPathRef객체를 사용할수 있습니다. 포인트(points)의 배열을 지정할때, 키프레임 애니메이션 객체는 연속되는 점 사이의 직선을 그리고 그 경로를 따라 갑니다. CGPathRef객체를 지정할때, 애니메이션은 경로의 시작 점에서 시작하고 외곽선(outline)을 따라가며, 곡선을 포함하여, 열려있거나 닫힌 경로를 사용할 수 있습니다.

키 프레임 에니메이션의 타이밍 지정하기(Specifying the Timing of a Keyframe Animation)

키 프레임 에이메이션의 타이밍(timing)과 페이징(pacing)은 기본 애니메이녓보다 더 복잡하고 그것들을 제어하는데 사용할수 있는 몇가지 속성이 있습니다.

  • calculationMode 속성은 애니메이션 타이밍을 계산할때 사용하는 알고리즘을 정희합니다. 이 속성의 값은 다른 타이밍 관련된 속성에 영향을 줍니다
    • 선형(linear), 큐빅(cubic) 애니메이션 - 이것은, calculationMode속성이 kCAAnimationLiner 또는 kCAAnimationCubic으로 설정된 경우 - 애니메이션을 생성하기 위해 제공된 타이밍 정보를 사용합니다. 이러한 모드들은 애니메이션 타이밍을 최대한으로 제어합니다.
    • 페이지(Paced) 애니메이션 - calculationMode속성이 kCAAnimationPaced 또는 kCAAnimationCubicPaced으로 설정된 경우 - keyTimes 또는 timingFunctions 속성에서 제공되는 외부 타이밍 값에 의존하지 않습니다. 대신, 타이밍 값은 암시적으로 계산되어 애니메이션에 일정한 속도로 제공됩니다.
    • 분리(Discrete) 애니메이션 - calculationMode 속성이 kCAAnimationDiscrete 로 설정된 경우 - 애니메이션된 속성이 보간(interpolation)없이 하나의 키 프레임 값에서 다음 값으로 점프하도록 합니다. 이 계산 모드는 keyTimes 속성의 값을 사용하지만 timingFunctions 속성은 무시합니다.
  • keyTimes 속성은 각 키 프레임 값에 적용할 시간을 지정합니다. 이 속성은 계산(calculation) 모드가 kCAAnimationLiner , kCAAnimationDiscrete 또는 kCAAnimationCubic로 설정된 경우에 사용됩니다. 페이징(paced)된 애니메이션에는 사용되지 않습니다.
  • timingFunctions 속성은 각 키프레임 세그먼트(segment)에 사용하기 위한 타이밍 곡선(timing curves)을 지정합니다. (이 속성은 상속된 timingFunction 속성을 대체합니다.)

애니메이션 타이밍을 스스로 조절하고 싶은 경우에, kCAAnimationLiner 또는 kCAAnimationcubic 모드와 keyTimes와 timingFunctions속성을 사용합니다. keyTimes는 각 키 프레임 값을 적용할 시점을 정의합니다. 모든 중간(intermediate) 값에 대한 타이밍은 타이밍 함수에 의해 제어되며, 각 세그먼트(segment)에 ease-in 또는 ease-out 곡선을 적용할 수 있습니다. 타이밍 함수를 지정하지 않으면, 타이밍은 선형(linear)입니다.

실행중에 명시적으로 애니메이션을 멈추기(Stoping an Explicit Animation While It is Running)

애니메이션은 일반적으로 완료될때까지 실행되지만, 필요한 경우에 다음에 오는 기술중 하나를 사용하여 일찍 멈출수 있습니다.

  • 레이어에 있는 단일 애니메이션 객체를 제거 하려면, 레이어의 removeAnimationForKey:메소드를 호출하여 애니메이션 객체를 제거합니다. 이 메소드는 addAnimation:forKey:메소드에서 전달된 키를 사용하여 애니메이션을 식별합니다. 그 키는 반드시 nii이 아닌 것을 지정해야 합니다.
  • 레이어에 있는 모든 애니메이션 객체들을 제거하려면, 레이어의 removeAllAnimations 메소드를 호출합니다. 이 메소드는 실행중인 모든 애니메이션을 즉시 제거하고 현새 상태 정보로 레이어를 다시 그립니다.

주의
레이어에서 암시적인 애니메이션을 직접 제거할 수는 없습니다.

레이어로부터 애니메이션을 제거할때, 코어 애니메이션은 현재 값을 사용하여 레이어를 다시 그려서 응답합니다. 현재 값은 보통 애니메이션의 끝 값이기 때문에, 이로 인해 레이어의 모습이 갑자기 튀어 나올수 있습니다. 애니메이션의 마지막 프레임에서 레이어의 모양을 유지하려면, 프리젠테이션 트리(presentation tree)에 있는 객체를 사용하여 마지막 값을 검색하고 레이어 트리(layer tree)의 객체에 설정할 수 있습니다.

임시로 애니메이션을 일시정지하는 것에 대한 정보는 목록 5-4를 보세요.

여러 변경사항을 함께 애니메이션하기(Animating Multiple Changes Together)

동시에 레이어 객체에 여러 애니메이션을 적용하길 원하는 경우, CAAnimationGroup 객체를 사용하여 그것들을 함께 그룹화 할수 있습니다. 그룹 객체를 사용하여 단일 구성점을 제공하여 여러개의 애니메이션 객체들을 간단하게 관리할 수 있습니다. 그룹에 적용된 타이밍과 기간 값은 개별 애니메이션 객체들에 동일한 값을 재정의합니다.

[목록 3-4]는 동일한 시간과 동일한 기간동안 두개의 경계 관련(border-related) 애니메이션들을 애니메이션 그룹화하는 방법을 보여줍니다.

[목록 3-4] 두 애니메이션을 함께 애니메이션하기

// Animation 1
CAKeyframeAnimation* widthAnim = [CAKeyframeAnimation animationWithKeyPath:@"borderWidth"];
NSArray* widthValues = [NSArray arrayWithObjects:@1.0, @10.0, @5.0, @30.0, @0.5, @15.0, @2.0, @50.0, @0.0, nil];
widthAnim.values = widthValues;
widthAnim.calculationMode = kCAAnimationPaced;
 
// Animation 2
CAKeyframeAnimation* colorAnim = [CAKeyframeAnimation animationWithKeyPath:@"borderColor"];
NSArray* colorValues = [NSArray arrayWithObjects:(id)[UIColor greenColor].CGColor,
            (id)[UIColor redColor].CGColor, (id)[UIColor blueColor].CGColor,  nil];
colorAnim.values = colorValues;
colorAnim.calculationMode = kCAAnimationPaced;
 
// Animation group
CAAnimationGroup* group = [CAAnimationGroup animation];
group.animations = [NSArray arrayWithObjects:colorAnim, widthAnim, nil];
group.duration = 5.0;
 
[myLayer addAnimation:group forKey:@"BorderChanges"];

애니메이션을 함께 그룹화 하는 것보다 더 고급적인 방법은 트랜젝션(transactions) 객체를 사용하는 것입니다. 트랜젝션(Transactions)은 중첩된 애니메이션 세트를 만들고 각각 다른 애니메이션 매개변수를 지정할수 있도록, 좀 더 유연성을 제공합니다. 트랜젝션(transaction) 객체를 사용하는 방법에 대한 정보는 명시적인 트랜젝션으로 애니메이션 매개변수 변경하기(Explicit Transactions Let You Change Animation Parameters)를 보세요.

애니메이션이 끝나는 것을 감지하기(Detecting the End of an Animation)

코어 애니메이션은 애니메이션이 시작하거나 끝날때를 감지하는 것을 제공합니다. 이러한 알림(notification)은 애니메이션과 관련된 작업을 하기에 좋은 시간입니다. 예를 들어, 시작 알림을 사용하여 관련된 상태 정보를 설정하고 해당하는 종료 알림을 사용하여 상태를 해제할 수 있습니다.

다음은 애니메이션의 상태에 대해 알리는 두가지 방법이 있습니다.

  • setCompletionBlock:메소드를 사용하여 현재 트랜젝션 완료 블럭을 추가합니다. 트랜젝션에 있는 모든 애니메이션이 완료될때, 트랜젝션은 완료 블럭을 실행합니다.
  • CAAnimation 객체에 델리게이터를 할당하고 animationDidStart:와 animationDidStop:finished: 델리게이터 메소드를 구현합니다.

두개의 애니메이션을 함께 연결하려는 경우에 다른 하나가 끝날때 하나를 시작하며, 애니메이션 알림을 사용하지 않습니다. 대신에, 애니메이션 객체의 beginTime 속성을 사용하여 원하는 시점에 각각의 애니메이션 객체를 시작합니다. 두개의 애니메이션을 함께 연결하려면, 두번재 애니메이션의 시작시간을 첫번째 애니메이션의 종료시간으로 설정합니다. 애니메이션과 타이밍 값에 대한 자세한 정보는 애니메이션의 타이밍 사용자정의 하기(Customizing the Timing of an Animation)를 보세요.

레이어 기반의 뷰 애니메이션하는 방법(How to Animate Layer-Backed Views)

레이어가 레이어 기반 뷰에 속하는 경우, 애니메이션을 만드는 데 권장된 방법은 UIKit 또는 AppKit에서 제공되는 뷰 기반 애니메이션 인터페이스를 사용합니다. 코어 애니메이션 인터페이스를 사용하여 직접 레이어에 애니메이션을 적용하는 방법이 있지만 이러한 애니메이션을 만드는 방법은 대상 플랫폼에 따라 다릅니다.

iOS에서 레이어 수정하는 규칙(Rules for Modifying Layers in iOS)

iOS 뷰에는 항상 기본 레이어가 있기때문에, UIView 클래스 자체는 대부분의 데이터를 레이어 객체에서 직접 파생합니다. 결과적으로, 레이어에 대한 변경사항은 뷰 객체에 의해 자동적으로 반영됩니다. 이 동작은 코어 애니메이션 또는 UIView 인터페이스를 사용하여 변경할 수 있는 것을 의미합니다.

코어 애니메이션 클래스를 사용하여 애니메이션을 시작하려면, 뷰 기반의 애니메이션 블록 안쪽에서 모든 코어 애니메이션을 호출해야 합니다. UIView 클래스는 기본적으로 레이어 애니메이션을 비활성화 하지만 애니메이션 블록 안쪽에서 다시 활성화됩니다. 따라서 애니메이션 블록 바깥쪽에서 변경한 것은 애니메이션이 적용되지 않습니다. [목록 3-5]는 레이어의 암시적으로 불투명도와 명시적으로 위치를 변경하는 방법에 대한 예제를 보여줍니다. 예제에서, myNewPosition변수는 미리 계산되고 블록에 의해 캡쳐됩니다. 두 애니메이션 모두 동시에 시작되지만, 위치 애니메이션은 해당 애니메이션 객체에 지정된 타이밍으로 실행되는 동안에, 불투명도(opacity) 애니메이션은 기본 타이밍으로 실행됩니다.

[목록 3-5] iOS 뷰에 첨부된 레이어 애니메이션하기

[UIView animateWithDuration:1.0 animations:^{
   // Change the opacity implicitly.
   myView.layer.opacity = 0.0;
 
   // Change the position explicitly.
   CABasicAnimation* theAnim = [CABasicAnimation animationWithKeyPath:@"position"];
   theAnim.fromValue = [NSValue valueWithCGPoint:myView.layer.position];
   theAnim.toValue = [NSValue valueWithCGPoint:myNewPosition];
   theAnim.duration = 3.0;
   [myView.layer addAnimation:theAnim forKey:@"AnimateFrame"];
}];

OS X에서 레이어 수정하는 규칙(Rules for Modifying Layers in OS X)

OS X에서 레이어 기반의 뷰에 애니메이션 변경사항을 적용하려면, 뷰 자체의 인터페이스를 사용하는 것이 가장 좋습니다. 드물지만, 레이어 기반의 NSView 객체들 중 하나에 첨부된 레이어를 직접 수정 해야 합니다. AppKit은 해당 레이어 객체를 생성하고 구성하고 앱이 실행되는 동안 레이어 객채를 관리합니다. 레이어를 수정하면 뷰 객체와 동기화되지 않을수 있고 예상치 못한 결과가 될수 있습니다. 레이어 기반(layer-backed) 뷰에 대해, 코드는 레이어 객체의 다음 속성들을 절대 수정하지 않아야 합니다.

중요
이전 제한사항은 레이어 호스팅(layer-hostings) 뷰에는 적용되지 않습니다. 레이어 객체를 생성하고 뷰와 수동적으로 연관시킨 경우에, 해당 레이어의 속성을 수정하고 해당 뷰 객체를 동기화 상태로 유지해야 합니다.

AppKit은 기본적으로 레이어 기반의 뷰에 대해서 암시적인 애니메이션을 비활성화 합니다. 뷰의 애니메이터 프록시 객체는 자동으로 암시적인 애니메이션을 다시 활성화 합니다. 레이어 속성을 직접 애니메이션하는 경우에, 프로그래밍 방식으로 현재 NSAnimationContext 객체의allowsImplicitAnimation속성을 YES 변경하여 암시적인 애니메이션을 다시 활성화 할 수 있습니다. 다시 말하지만, 이전 목록에 없는 애니메이션 가능한 속성에 대해서만 이 작업을 해야 합니다.

뷰 제약조건을 애니메이션의 일부로 업데이트 하는것을 기억하기(Remember to Update View Constraints as Part of Your Animation)

뷰의 위치를 관리하기 위해 제약조건 기반의 레이아웃 규칙을 사용하는 경우, 해당 애니메이션 구성의 일부로 애니메이션을 방해(interfere) 할 수 있는 모든 제약조건을 제거해야 합니다. 제약 조건은 뷰의 위치나 크기에 대한 모든 변경사항에 영향을 줍니다. 또한 뷰와 하위 뷰간의 관계에도 영향을 줍니다. 이러한 항목들을 변경하는 애니메이션 하는 경우에, 제약조건을 제거하고, 변경한 다음에 필요한 새로운 제약조건을 적용할 수 있습니다.

제약 조건과 뷰의 레이아웃을 관리하기 위해 제약조건을 사용하는 방법에 대한 자세한 내용은 오토레이아웃 가이드(Auto Layout Guide)을 보세요.

반응형
Posted by 까칠코더
,