[ios] iOS : 새로운 자동 레이아웃 제약 (높이)에 애니메이션을 적용하는 방법

이전 에는 자동 레이아웃 제약 조건으로 작업 한 적이 없습니다 . 작업중인 작은 새 앱이 있는데 NIB의보기가 기본적으로 자동 레이아웃으로 설정되어 있음을 알았습니다. 그래서 나는 그것을 함께 일할 기회를 잡고 애플이 이것으로 어디로 가고 있는지 알아 내려고 노력할 것이라고 생각했습니다.

첫 번째 도전 :

MKMapView의 크기를 조정해야하며 새 위치로 애니메이션을 적용하고 싶습니다. 내가 익숙한 방식으로 이렇게하면 :

[UIView animateWithDuration:1.2f
     animations:^{
         CGRect theFrame = worldView.frame;
         CGRect newFrame = CGRectMake(theFrame.origin.x, theFrame.origin.y, theFrame.size.width, theFrame.size.height - 170);
         worldView.frame = newFrame;
}];

… 그러면 MKMapView는 형제 뷰가 업데이트 될 때마다 원래 높이로 ‘스냅’됩니다 (내 경우에는 UISegmentedControl의 제목이 업데이트되고 있음 [myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0]).

그럼, 내가 생각 나는 그것이 그 UISegmentedControl의 상단에 상대가되기 위해서는 부모 뷰의 높이와 동일되는 것을 MKMapView의 제약을 변경되고 싶지 커버 :V:[MKMapView]-(16)-[UISegmentedControl]

내가 원하는 것은 맵 뷰 아래의 일부 컨트롤이 드러나도록 MKMapView 높이를 줄이는 것입니다. 이렇게하려면 제약 조건을 고정 전체 크기보기에서 하단이 UISegmentedControl의 상단으로 제한되는보기로 변경해야 한다고 생각 합니다. 그리고보기가 새로운 크기로 축소 될 때 애니메이션을 적용하고 싶습니다.

이것에 대해 어떻게 갑니까?

편집- 이 애니메이션은 보기 하단이 즉시 170 위로 이동하지만 애니메이션이 적용 되지 않습니다 .

    [UIView animateWithDuration:1.2f
         animations:^{
             self.nibMapViewConstraint.constant = -170;

    }];

그리고는 nibMapViewConstraint바닥 수직 공간의 제약으로 IB에 연결되어 있습니다.



답변

제약 조건을 업데이트 한 후 :

[UIView animateWithDuration:0.5 animations:^{[self.view layoutIfNeeded];}];

self.view포함하는 뷰에 대한 참조로 바꿉니다 .


답변

이것은 나를 위해 작동합니다 (iOS7 및 iOS8 + 모두). 조정하려는 자동 레이아웃 제약을 클릭합니다 (인터페이스 빌더에서 예 : 상단 제약). 다음으로 이것을 IBOutlet으로 만드십시오.

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint;

위쪽으로 애니메이션;

    self.topConstraint.constant = -100;    
    [self.viewToAnimate setNeedsUpdateConstraints]; 
    [UIView animateWithDuration:1.5 animations:^{
        [self.viewToAnimate layoutIfNeeded]; 
    }];

원래 위치로 다시 애니메이션

    self.topConstraint.constant = 0;    
    [self.viewToAnimate setNeedsUpdateConstraints];  
    [UIView animateWithDuration:1.5 animations:^{
        [self.viewToAnimate layoutIfNeeded];
    }];


답변

자동 레이아웃과 함께 애니메이션을 사용하는 방법을 설명하는 애플 자체의 아주 좋은 튜토리얼이 있습니다. 이 링크를 따라 “예제 별 자동 레이아웃”이라는 비디오를 찾으십시오. 자동 레이아웃에 대한 흥미로운 내용을 제공하고 마지막 부분은 애니메이션 사용 방법에 대한 것입니다.


답변

내가 만든 이 작은 데모가 가능합니다 . 매우 간단한 예제에서 자동 레이아웃 제약 조건을 변경하고 애니메이션 할 수있는 방법을 보여줍니다. DemoViewController.m을 살펴 보십시오 .


답변

대부분의 사람들은 자동 레이아웃을 사용하여 뷰의 항목을 레이아웃하고 레이아웃 제한을 수정하여 애니메이션을 만듭니다.

많은 코드없이이 작업을 수행하는 쉬운 방법은 Storyboard에서 애니메이션하려는 UIView를 만든 다음 UIView를 종료 할 숨겨진 UIView를 만드는 것입니다. xcode에서 미리보기를 사용하여 두 UIView가 원하는 위치에 있는지 확인할 수 있습니다. 그 후 종료 UIView를 숨기고 레이아웃 제약 조건을 바꿉니다.

직접 작성하고 싶지 않은 경우 SBP라는 레이아웃 제한을 스왑하기위한 podfile이 있습니다.

여기에 튜토리얼이 있습니다.


답변

필요가 더 사용하지하는 IBOutlet reference대신 직접 수있는이의 제약 access또는 update이미 제약 조건을 적용하거나 적용 Programmatically또는에서 Interface Builder사용하는보기에 KVConstraintExtensionsMaster라이브러리를. 이 라이브러리는 또한의 Cumulative동작을 관리합니다 NSLayoutConstraint.

containerView에 높이 제약 조건을 추가하려면

 CGFloat height = 200;
 [self.containerView applyHeightConstrain:height];

containerView의 높이 제약 조건을 애니메이션으로 업데이트하려면

[self.containerView accessAppliedConstraintByAttribute:NSLayoutAttributeHeight completion:^(NSLayoutConstraint *expectedConstraint){
        if (expectedConstraint) {
            expectedConstraint.constant = 100;

            /* for the animation */ 
            [self.containerView  updateModifyConstraintsWithAnimation:NULL];
      }
    }];


답변