2016-11-01 5 views
2

두 개의보기가 포함 된보기 컨트롤러가 있습니다. 필요한 것은 뷰 컨트롤러를 밀고 나면 화면의 왼쪽 (_sidepanelview)이 화면 왼쪽으로 이동한다는 것입니다. 여기 화면 밖으로 애니메이션보기가 잘못되었습니다.

은 내가 쓴 것입니다 :

-(void)viewDidAppear:(BOOL)animated{ 
    CGRect newsidepanelviewposition = _sidepanelview.frame; 
    newsidepanelviewposition.origin.x = -_sidepanelview.frame.size.width; 


    [UIView animateWithDuration:0.5 delay:1.0 options:UIViewAnimationOptionCurveEaseIn animations:^{ 
     _sidepanelview.frame = newsidepanelviewposition; 

    } completion:^(BOOL finished) { 
     NSLog(@"Done!"); 

    }]; 
} 

문제는 내가 응용 프로그램을 실행할 때 뷰 컨트롤러가 밀어 된 후, 보기 _sidepanelview이 화면에서 사라지고의 중심에 다시 나타납니다이다 화면 오른쪽에서 오는 대신 x = 0에서 x = -_sidepanelview 너비까지 화면에서 사라집니다.

내가 뭘 잘못하고있어?

참고 : 자동 레이아웃을 선택 취소하고 애니메이션을 올바르게 적용했지만 자동 레이아웃을 사용하여 문제가 해결되었습니다.

답변

1

note에서 알 수 있듯이 자동 레이아웃이 "범인"입니다. 뷰에는 AutoLayout 엔진에 의해 주기적으로 적용되는 제약 조건이 있습니다. 보기의 frame을 변경하면 프레임이 변경되지만보기의 레이아웃 제약은 변경되지 않습니다. layoutSubviews의 다음주기가 발생하면보기 위치와 크기 (예 : frame)가 제약 조건에 따라 재설정됩니다.

해당 뷰/뷰 컨트롤러에 AutoLayout을 포함 시키려면 제약 조건 변경을 사용하여 애니메이션을 수행하십시오.

여기서 황금 규칙은 setFrame은 AutoLayout과 반대입니다.

샘플 코드

-(void)viewDidAppear:(BOOL)animated { 

    _sidePanelLeadingSpace.constant = -_sidepanelview.frame.size.width; // 1 

    [UIView animateWithDuration:0.5 delay:1.0 options:UIViewAnimationOptionCurveEaseIn animations:^{ 

     [self.view layoutIfNeeded]; // 2 


    } completion:^(BOOL finished) { 
     NSLog(@"Done!"); 

    }]; 
} 
  1. 는 함께 IBOutlet 같이 _sidePanelLeadingSpace (NSLayoutConstraint), 예컨대 대 _sidepanelview의 선두 공간 제약에 대한 참조를 보유하고 있습니다.
  2. 알터 제약의 constant 및 애니메이션 블록에 layoutIfNeeded를 호출하여 뷰를 레이아웃
+0

가 어떻게 스토리 보드에 어떤 제약 지시 모순하기 위해 setFrame를 사용하는 방법을 말해 줄래? – Falcoa

+0

내가 말한 것은 'setFrame'은 프레임 업데이트가 제약 조건을 업데이트하지 않기 때문에 본질적으로 AutoLayout과 상충됩니다. AutoLayout을 사용한다면,'setFrame'을 사용하지 마십시오. 항상 제약 조건을 업데이트하십시오. 몇 가지 샘플 코드로 답변을 업데이트했습니다. –

+0

제 경우에는 제약 조건을 사용하여 컨테이너의 X와 Y에서 _sidepanelview를 가운데에 맞 춥니 다. 제약 조건을 어떻게 업데이트해야합니까? 예를 들어 leadingSpace 제약 조건을 사용하는 것을 봅니다. – Falcoa

관련 문제