programing

제약 조건 변경을 애니메이션화하려면 어떻게 해야 합니까?

oldcodes 2023. 5. 24. 22:20
반응형

제약 조건 변경을 애니메이션화하려면 어떻게 해야 합니까?

▁app▁an▁with▁old▁an다중▁i니로 오래된 앱을 업데이트하고 있습니다.AdBannerView그리고 광고가 없을 때, 그것은 화면에서 미끄러집니다.광고가 있을 때 화면에서 슬라이드합니다.기본적인 것들.

옛날 스타일로, 저는 애니메이션 블록에 프레임을 설정했습니다.새로운 스타일, 나는.IBOutlet다음을 결정하는 자동 감지 제약 조건으로Y위치(이 경우에는 수퍼뷰 하단에서 거리)를 지정하고 상수를 수정합니다.

- (void)moveBannerOffScreen {
    [UIView animateWithDuration:5 animations:^{
        _addBannerDistanceFromBottomConstraint.constant = -32;
    }];
    bannerIsVisible = FALSE;
}

- (void)moveBannerOnScreen {
    [UIView animateWithDuration:5 animations:^{
        _addBannerDistanceFromBottomConstraint.constant = 0;
    }];
    bannerIsVisible = TRUE;
}

그리고 배너는 정확히 예상대로 움직이지만, 애니메이션은 없습니다.


업데이트: 애니메이션을 다루는 자동 레이아웃 마스터링을 위한 WWDC 12가지 토크 모범 사례를 다시 보았습니다.Core Animation을 사용하여 제약 조건을 업데이트하는 방법에 대해 설명합니다.

다음 코드로 시도해 보았지만 정확히 같은 결과를 얻었습니다.

- (void)moveBannerOffScreen {
    _addBannerDistanceFromBottomConstraint.constant = -32;
    [UIView animateWithDuration:2 animations:^{
        [self.view setNeedsLayout];
    }];
    bannerIsVisible = FALSE;
}

- (void)moveBannerOnScreen {
    _addBannerDistanceFromBottomConstraint.constant = 0;
    [UIView animateWithDuration:2 animations:^{
        [self.view setNeedsLayout];
    }];
    bannerIsVisible = TRUE;
}

참고로, 나는 여러 번 확인했고 이것은 메인 스레드에서 실행되고 있습니다.

두 가지 중요한 참고 사항:

  1. 은 야합다니화에 .layoutIfNeeded애니메이션 블록 내에서.로 보류 인 모든 하기 위해 한 번 을 권장합니다.

  2. 상위 보기에서 구체적으로 호출해야 합니다(예:self.view), 제약 조건이 첨부된 하위 보기가 아닙니다.이렇게 하면 제약 조건을 변경한 뷰에 제약이 있을 수 있는 다른 뷰의 애니메이션을 포함하여 모든 제약이 있는 가 업데이트됩니다(예: 뷰 B가 뷰 A의 맨 아래에 부착되어 있고 뷰 A의 맨 위 간격띄우기를 방금 변경했으며 뷰 B가 이를 사용하여 애니메이션화되도록 할 수 있습니다).

사용해 보십시오.

목표-C

- (void)moveBannerOffScreen {
    [self.view layoutIfNeeded];

    [UIView animateWithDuration:5
        animations:^{
            self._addBannerDistanceFromBottomConstraint.constant = -32;
            [self.view layoutIfNeeded]; // Called on parent view
        }];
    bannerIsVisible = FALSE;
}

- (void)moveBannerOnScreen { 
    [self.view layoutIfNeeded];

    [UIView animateWithDuration:5
        animations:^{
            self._addBannerDistanceFromBottomConstraint.constant = 0;
            [self.view layoutIfNeeded]; // Called on parent view
        }];
    bannerIsVisible = TRUE;
}

스위프트 3

UIView.animate(withDuration: 5) {
    self._addBannerDistanceFromBottomConstraint.constant = 0
    self.view.layoutIfNeeded()
}

답변은 감사하지만 조금 더 진행하면 좋을 것 같습니다.

설명서의 기본 블록 애니메이션

[containerView layoutIfNeeded]; // Ensures that all pending layout operations have been completed
[UIView animateWithDuration:1.0 animations:^{
     // Make all constraint changes here
     [containerView layoutIfNeeded]; // Forces the layout of the subtree animation block and then captures all of the frame changes
}];

하지만 실제로 이것은 매우 단순한 시나리오입니다.서브뷰 제약 조건을 애니메이션화하려면 어떻게 해야 합니까?updateConstraints방법?

하위 뷰 updateConstraint 메서드를 호출하는 애니메이션 블록

[self.view layoutIfNeeded];
[self.subView setNeedsUpdateConstraints];
[self.subView updateConstraintsIfNeeded];
[UIView animateWithDuration:1.0f delay:0.0f options:UIViewAnimationOptionLayoutSubviews animations:^{
    [self.view layoutIfNeeded];
} completion:nil];

updateConstraints 메서드는 UIView 하위 클래스에서 재정의되므로 메서드 끝에 super를 호출해야 합니다.

- (void)updateConstraints
{
    // Update some constraints

    [super updateConstraints];
}

자동 레이아웃 가이드는 부족한 점이 많지만 읽을 가치가 있습니다.나 자신도 이것을 사용하고 있습니다.UISwitch한 의 하보를 전환는하쌍로로 입니다.UITextFields는 단순하고 미묘한 축소 애니메이션(0.2초 길이)입니다.하위 보기에 대한 제약 조건은 위에서 설명한 대로 UIView 하위 클래스 updateConstraints 메서드에서 처리되고 있습니다.

일반적으로 제약 조건을 업데이트하고 전화를 걸면 됩니다.layoutIfNeeded애니메이션 블록 안에 있습니다.이는 다음을 변경할 수 있습니다..constantNSLayoutConstraint조건 제거 7) iOS 7(iOS 7) .active제약 조건의 특성(iOS 8 및 9).

샘플 코드:

[UIView animateWithDuration:0.3 animations:^{
    // Move to right
    self.leadingConstraint.active = false;
    self.trailingConstraint.active = true;

    // Move to bottom
    self.topConstraint.active = false;
    self.bottomConstraint.active = true;

    // Make the animation happen
    [self.view setNeedsLayout];
    [self.view layoutIfNeeded];
}];

샘플 설정:

Xcode Project 그래서 애니메이션 프로젝트를 샘플합니다.

논란

애니메이션 블록 이전에 제약 조건을 변경해야 하는지 아니면 그 안에서 변경해야 하는지에 대한 몇 가지 질문이 있습니다(이전 답변 참조).

다음은 iOS를 가르치는 마틴 필킹턴과 오토레이아웃을 쓴 켄 페리의 트위터 대화입니다.켄은 애니메이션 블록 외부에서 상수를 변경하는 것이 현재 작동할 수 있지만 안전하지 않으며 애니메이션 블록 내부에서 상수를 변경해야 한다고 설명합니다.https://twitter.com/kongtomorrow/status/440627401018466305

애니메이션:

샘플 프로젝트

다음은 보기를 애니메이션화하는 방법을 보여주는 간단한 프로젝트입니다.목표 C를 사용하고 있으며 뷰를 변경하여 애니메이션화합니다..active여러 제약 조건의 특성.https://github.com/shepting/SampleAutoLayoutAnimation

// Step 1, update your constraint
self.myOutletToConstraint.constant = 50; // New height (for example)

// Step 2, trigger animation
[UIView animateWithDuration:2.0 animations:^{

    // Step 3, call layoutIfNeeded on your animated view's parent
    [self.view layoutIfNeeded];
}];

스위프트 4 솔루션

UIView.애니메이션

세 가지 간단한 단계:

  1. 제약 조건을 변경합니다. 예:

    heightAnchor.constant = 50
    
  2. 포함된 내용을 설명합니다.view레이아웃이 더럽고 자동 레이아웃이 레이아웃을 다시 계산해야 합니다.

    self.view.setNeedsLayout()
    
  3. 애니메이션 블록에서 레이아웃이 레이아웃을 다시 계산하도록 지시합니다. 이는 프레임을 직접 설정하는 것과 같습니다(이 경우 자동 레이아웃이 프레임을 설정합니다).

    UIView.animate(withDuration: 0.5) {
        self.view.layoutIfNeeded()
    }
    

완전한 단순한 예:

heightAnchor.constant = 50
self.view.setNeedsLayout()
UIView.animate(withDuration: 0.5) {
    self.view.layoutIfNeeded()
}

사이드 노트

에 0단계를 할 수 . 제약 조건을 변경하기 전에 호출할 수 있습니다.self.view.layoutIfNeeded()애니메이션의 시작점이 이전 제약 조건이 적용된 상태인지 확인합니다(애니메이션에 포함해서는 안 되는 다른 제약 조건 변경이 있는 경우).

otherConstraint.constant = 30
// this will make sure that otherConstraint won't be animated but will take effect immediately
self.view.layoutIfNeeded()

heightAnchor.constant = 50
self.view.setNeedsLayout()
UIView.animate(withDuration: 0.5) {
    self.view.layoutIfNeeded()
}

UIView속성 애니메이터

iOS 10을 사용한 이후로 우리는 새로운 애니메이션 메커니즘을 갖게 되었습니다.UIViewPropertyAnimator우리는 기본적으로 같은 메커니즘이 그것에 적용된다는 것을 알아야 합니다.단계는 기본적으로 동일합니다.

heightAnchor.constant = 50
self.view.setNeedsLayout()
let animator = UIViewPropertyAnimator(duration: 0.5, timingParameters: UICubicTimingParameters(animationCurve: .linear))
animator.addAnimations {
    self.view.layoutIfNeeded()
}
animator.startAnimation()

때부터animator애니메이션을 캡슐화한 것이므로 참조하고 나중에 호출할 수 있습니다.그러나 애니메이션 블록에서는 프레임을 다시 계산하도록 자동 레이아웃을 지정하기 때문에 호출하기 전에 제약 조건을 변경해야 합니다.startAnimation따라서 다음과 같은 것이 가능합니다.

// prepare the animator first and keep a reference to it
let animator = UIViewPropertyAnimator(duration: 0.5, timingParameters: UICubicTimingParameters(animationCurve: .linear))
animator.addAnimations {
    self.view.layoutIfNeeded()
}

// at some other point in time we change the constraints and call the animator
heightAnchor.constant = 50
self.view.setNeedsLayout()
animator.startAnimation()

제약 조건을 변경하고 애니메이터를 시작하는 순서는 중요합니다. 제약 조건을 변경하고 애니메이터를 나중에 지정한 시점으로 두면 다음에 다시 그리기 사이클에서 자동 레이아웃 재계산을 실행할 수 있으며 변경 사항이 애니메이션으로 표시되지 않습니다.

또한 단일 애니메이터는 재사용할 수 없습니다. 한 번 실행하면 "재실행"할 수 없습니다.그래서 저는 우리가 대화형 애니메이션을 제어하기 위해 그것을 사용하지 않는 한, 애니메이터를 곁에 둘 좋은 이유가 없다고 생각합니다.

신속한 솔루션:

yourConstraint.constant = 50
UIView.animate(withDuration: 1.0, animations: {
    yourView.layoutIfNeeded
})

스토리보드, 코드, 팁 및 몇 가지 Gotchas

다른 답변은 괜찮지만 최근의 예를 사용하여 제약 조건을 애니메이션화하는 데 있어 상당히 중요한 몇 가지 요점을 강조합니다.저는 다음과 같은 것들을 깨닫기 전에 많은 변화를 겪었습니다.

대상으로 지정할 제약 조건을 클래스 변수로 만들어 강력한 참조를 유지합니다.스위프트에서 나는 게으른 변수를 사용했습니다.

lazy var centerYInflection:NSLayoutConstraint = {
       let temp =  self.view.constraints.filter({ $0.firstItem is MNGStarRating }).filter ( { $0.secondItem is UIWebView }).filter({ $0.firstAttribute == .CenterY }).first
        return temp!
}()

몇 가지 실험 후에 저는 위의 관점(일명 슈퍼뷰)에서 제약 조건이 정의된 두 가지 관점에서 제약 조건을 얻어야 한다는 것에 주목했습니다.아래 예제에서 (MNGStarRating과 UIWebView 모두 내가 제약 조건을 만드는 두 가지 유형의 항목이며 self.view 내의 하위 뷰입니다.)

필터 체인

Swift의 필터 방법을 활용하여 변곡점 역할을 할 원하는 제약 조건을 분리합니다.또한 훨씬 더 복잡해질 수 있지만 필터는 여기서 잘 작동합니다.

Swift를 사용하여 제약 조건 애니메이션 생성

Not a Bene - 이 예는 스토리보드/코드 솔루션이며 스토리보드에서 기본 제약 조건을 설정했다고 가정합니다.그런 다음 코드를 사용하여 변경 사항을 애니메이션화할 수 있습니다.

정확한 기준으로 필터링할 속성을 만들고 애니메이션의 특정 변곡점에 도달한다고 가정할 때(물론 여러 제약 조건이 필요한 경우 배열을 필터링하고 루프스루할 수도 있습니다):

lazy var centerYInflection:NSLayoutConstraint = {
    let temp =  self.view.constraints.filter({ $0.firstItem is MNGStarRating }).filter ( { $0.secondItem is UIWebView }).filter({ $0.firstAttribute == .CenterY }).first
    return temp!
}()

....

잠시 후에...

@IBAction func toggleRatingView (sender:AnyObject){

    let aPointAboveScene = -(max(UIScreen.mainScreen().bounds.width,UIScreen.mainScreen().bounds.height) * 2.0)

    self.view.layoutIfNeeded()


    //Use any animation you want, I like the bounce in springVelocity...
    UIView.animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.75, options: [.CurveEaseOut], animations: { () -> Void in

        //I use the frames to determine if the view is on-screen
        if CGRectContainsRect(self.view.frame, self.ratingView.frame) {

            //in frame ~ animate away
            //I play a sound to give the animation some life

            self.centerYInflection.constant = aPointAboveScene
            self.centerYInflection.priority = UILayoutPriority(950)

        } else {

            //I play a different sound just to keep the user engaged
            //out of frame ~ animate into scene
            self.centerYInflection.constant = 0
            self.centerYInflection.priority = UILayoutPriority(950)
            self.view.setNeedsLayout()
            self.view.layoutIfNeeded()
         }) { (success) -> Void in

            //do something else

        }
    }
}

많은 잘못된 방향으로

이 노트들은 정말로 제가 직접 쓴 팁들의 집합입니다.나는 개인적으로 그리고 고통스럽게 하지 않는 모든 것을 했습니다.이 가이드가 다른 사람들을 구할 수 있기를 바랍니다.

  1. zPositioning을 주의하십시오.가끔 아무 일도 일어나지 않을 때는 다른 보기 중 일부를 숨기거나 보기 디버거를 사용하여 애니메이션 보기를 찾아야 합니다.스토리보드의 xml에서 사용자 정의 런타임 속성이 손실되어 애니메이션 보기가 작업 중에 가려지는 사례도 발견했습니다.

  2. 항상 잠시 시간을 내어 설명서(신규 및 이전), 빠른 도움말 및 머리글을 읽으십시오.Apple은 AutoLayout 제약 조건을 보다 효율적으로 관리하기 위해 많은 변경을 계속하고 있습니다(스택 보기 참조).아니면 적어도 자동 레이아웃 요리책은.최고의 솔루션이 이전 설명서/비디오에 있을 수도 있습니다.

  3. 애니메이션의 값을 가지고 놀고 다른 애니메이션을 사용하는 것을 고려합니다.지속 시간 변형 포함.

  4. 특정 레이아웃 값을 다른 상수의 변경을 결정하는 기준으로 하드 코딩하지 말고 뷰 위치를 결정할 수 있는 값을 사용합니다. CGRectContainsRect를 들어 입니다.

  5. 조건 let viewMargins = self.webview.layoutMarginsGuide에 있습니다.
  6. 할 필요가 없는 작업을 수행하지 마십시오. 스토리보드에 제약 조건이 있는 모든 뷰에는 self.viewName.constraints 속성에 제약 조건이 연결되어 있습니다.
  7. 제약 조건의 우선 순위를 1000 미만으로 변경합니다.스토리보드에서 내 것을 250(낮음) 또는 750(높음)으로 설정했습니다. (1000 우선순위를 코드의 어떤 것으로 변경하려고 하면 1000이 필요하기 때문에 앱이 충돌합니다.)
  8. 즉시 activateConstraints와 activateConstraints를 사용하려고 하지 않는 것을 고려하십시오(그들은 그들의 자리를 가지고 있지만 단지 학습하거나 스토리보드를 사용하고 있다면 아마도 당신이 너무 많이 하는 것을 의미할 것입니다. 아래에 보이는 것처럼 그들은 자리를 가지고 있습니다.
  9. 코드에 새 제약 조건을 추가하는 경우가 아니라면 addConstraints/removeConstraints를 사용하지 않는 것이 좋습니다.대부분의 경우 스토리보드에서 보기를 원하는 제약 조건으로 레이아웃한 다음(보기를 화면 밖으로 배치) 코드에서는 스토리보드에서 이전에 만든 제약 조건을 애니메이션으로 만들어 보기를 이동시킵니다.
  10. 새로운 NSanchor Layout 클래스와 하위 클래스를 통해 제약 조건을 구축하는 데 많은 시간을 허비했습니다.이 작업들은 괜찮지만 제가 필요로 하는 모든 제약이 이미 스토리보드에 존재한다는 것을 깨닫는 데 시간이 걸렸습니다.코드에서 제약 조건을 작성하는 경우 다음 방법을 사용하여 제약 조건을 집계합니다.

스토리보드 사용 시 피해야 할 솔루션의 빠른 샘플

private var _nc:[NSLayoutConstraint] = []
    lazy var newConstraints:[NSLayoutConstraint] = {

        if !(self._nc.isEmpty) {
            return self._nc
        }

        let viewMargins = self.webview.layoutMarginsGuide
        let minimumScreenWidth = min(UIScreen.mainScreen().bounds.width,UIScreen.mainScreen().bounds.height)

        let centerY = self.ratingView.centerYAnchor.constraintEqualToAnchor(self.webview.centerYAnchor)
        centerY.constant = -1000.0
        centerY.priority = (950)
        let centerX =  self.ratingView.centerXAnchor.constraintEqualToAnchor(self.webview.centerXAnchor)
        centerX.priority = (950)

        if let buttonConstraints = self.originalRatingViewConstraints?.filter({

            ($0.firstItem is UIButton || $0.secondItem is UIButton )
        }) {
            self._nc.appendContentsOf(buttonConstraints)

        }

        self._nc.append( centerY)
        self._nc.append( centerX)

        self._nc.append (self.ratingView.leadingAnchor.constraintEqualToAnchor(viewMargins.leadingAnchor, constant: 10.0))
        self._nc.append (self.ratingView.trailingAnchor.constraintEqualToAnchor(viewMargins.trailingAnchor, constant: 10.0))
        self._nc.append (self.ratingView.widthAnchor.constraintEqualToConstant((minimumScreenWidth - 20.0)))
        self._nc.append (self.ratingView.heightAnchor.constraintEqualToConstant(200.0))

        return self._nc
    }()

다음 팁 중 하나를 잊어버리거나 layoutIfNeeded와 같은 간단한 팁을 잊어버린 경우에는 대부분 아무 일도 일어나지 않습니다.이 경우 다음과 같이 반쯤 구워진 용액을 사용할 수 있습니다.

NB - 잠시 시간을 내어 아래의 자동 레이아웃 섹션과 원본 가이드를 읽어 보십시오.이러한 기술을 사용하여 Dynamic Animator를 보완하는 방법이 있습니다.

UIView.animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 1.0, options: [.CurveEaseOut], animations: { () -> Void in

            //
            if self.starTopInflectionPoint.constant < 0  {
                //-3000
                //offscreen
                self.starTopInflectionPoint.constant = self.navigationController?.navigationBar.bounds.height ?? 0
                self.changeConstraintPriority([self.starTopInflectionPoint], value: UILayoutPriority(950), forView: self.ratingView)

            } else {

                self.starTopInflectionPoint.constant = -3000
                 self.changeConstraintPriority([self.starTopInflectionPoint], value: UILayoutPriority(950), forView: self.ratingView)
            }

        }) { (success) -> Void in

            //do something else
        }

    }

자동 레이아웃 가이드의 일부(두 번째 일부는 OS X 사용을 위한 것입니다). BTW - 제가 보기에는 이상 현재 가이드에 나와 있지 않습니다.선호하는 기술은 계속 진화하고 있습니다.

자동 레이아웃에 의해 변경된 애니메이션 제작

자동 레이아웃에서 변경한 애니메이션을 완전히 제어해야 하는 경우에는 제약 조건을 프로그래밍 방식으로 변경해야 합니다.기본 개념은 iOS와 OS X 모두 동일하지만 몇 가지 사소한 차이점이 있습니다.

iOS 앱에서 코드는 다음과 같습니다.

[containerView layoutIfNeeded]; // Ensures that all pending layout operations have been completed
[UIView animateWithDuration:1.0 animations:^{
     // Make all constraint changes here
     [containerView layoutIfNeeded]; // Forces the layout of the subtree animation block and then captures all of the frame changes
}];

OS X에서 계층 지원 애니메이션을 사용할 때 다음 코드를 사용합니다.

[containterView layoutSubtreeIfNeeded];
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
     [context setAllowsImplicitAnimation: YES];
     // Make all constraint changes here
     [containerView layoutSubtreeIfNeeded];
}];

레이어 백업 애니메이션을 사용하지 않는 경우 제약 조건의 애니메이터를 사용하여 상수를 애니메이션화해야 합니다.

[[constraint animator] setConstant:42];

시각적으로 더 잘 배우는 사람들은 Apple의 이 초기 비디오를 확인하십시오.

세심한 주의

문서에는 종종 더 큰 아이디어로 이어지는 작은 노트나 코드 조각이 있습니다.예를 들어 동적 애니메이터에 자동 레이아웃 제약 조건을 추가하는 것은 좋은 생각입니다.

행운과 포스가 함께 하길 바랍니다.

작업 솔루션 100% Swift 5.3

나는 모든 답을 읽었고 그것들을 정확하게 애니메이션화하기 위해 내가 내 모든 애플리케이션에서 사용한 라인의 코드와 계층을 공유하고 싶습니다. 여기에 있는 일부 솔루션은 작동하지 않습니다. 당신은 지금 아이폰 5와 같은 느린 장치에서 그것들을 확인해야 합니다.

self.btnHeightConstraint.constant = 110
UIView.animate(withDuration: 0.27) { [weak self] in 
     self?.view.layoutIfNeeded()
}

저는 제약 조건을 애니메이션화하려고 노력했지만 좋은 설명을 찾기가 정말 쉽지 않았습니다.

다른 응답자들이 말하는 것은 전적으로 사실입니다. 전화해야 합니다.[self.view layoutIfNeeded];東京의 animateWithDuration: animations:하지만, 또 다른 중요한 점은 모든 것에 대한 포인터를 갖는 것입니다.NSLayoutConstraint당신은 애니메이션을 원합니다.

GitHub에서 예제를 만들었습니다.

Xcode 8.3.3이 설치된 Swift 3용 작동 및 테스트 완료 솔루션:

self.view.layoutIfNeeded()
self.calendarViewHeight.constant = 56.0

UIView.animate(withDuration: 0.5, delay: 0.0, options: UIViewAnimationOptions.curveEaseIn, animations: {
        self.view.layoutIfNeeded()
    }, completion: nil)

self.calendarView를 기억하십시오.높이는 사용자 정의 보기(CalendarView)라고 하는 제약 조건입니다..layoutIfNeeded()를 직접 호출했습니다.self.calendarView에 표시 및 표시되지 않음

도움이 되길 바랍니다.

이에 대한 기사가 있습니다. http://weblog.invasivecode.com/post/42362079291/auto-layout-and-core-animation-auto-layout-was

거기서 그는 다음과 같이 코딩했습니다.

- (void)handleTapFrom:(UIGestureRecognizer *)gesture {
    if (_isVisible) {
        _isVisible = NO;
        self.topConstraint.constant = -44.;    // 1
        [self.navbar setNeedsUpdateConstraints];  // 2
        [UIView animateWithDuration:.3 animations:^{
            [self.navbar layoutIfNeeded]; // 3
        }];
    } else {
        _isVisible = YES;
        self.topConstraint.constant = 0.;
        [self.navbar setNeedsUpdateConstraints];
        [UIView animateWithDuration:.3 animations:^{
            [self.navbar layoutIfNeeded];
        }];
    }
}

도움이 되길 바랍니다.

제약 애니메이션의 맥락에서, 저는 키보드_opened 알림 내에서 제약 조건을 바로 애니메이션화한 특정 상황을 언급하고 싶습니다.

제약 조건이 텍스트 필드에서 컨테이너의 맨 위까지 위쪽 공간을 정의했습니다.키보드를 열면 상수를 2로 나눕니다.

키보드 알림에서 직접 일관된 부드러운 제약 애니메이션을 얻을 수 없었습니다.약 절반의 시간 보기는 애니메이션 없이 새 위치로 이동합니다.

키보드 열기로 인해 추가 레이아웃이 발생할 수 있다는 생각이 들었습니다.10ms 지연의 간단한 dispatch_after 블록을 추가하면 애니메이션이 매번 실행됩니다 - 점프하지 않습니다.

언급URL : https://stackoverflow.com/questions/12622424/how-do-i-animate-constraint-changes

반응형