2014-04-07 5 views
0

오늘, 취소 후 기본 원점으로 돌아가는보기를 얻으려고합니다. 나는 이것을하기 위해 두 개의 VC를 사용하고있다. 하나는 테이블 뷰의 바닥 글 컨트롤러이고 다른 하나는 첫 번째 애니메이션 이후에 표시되는 모달보기입니다. 모달 뷰에서 되돌아 가려고 할 때마다, 첫 번째 애니메이션을 수행 한 후에도 원점은 여전히 ​​동일합니다. 원래 위치로 원점을 이동

Footer: 

    -(IBAction)addPerson:(id)sender{ 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:0.25]; 
     NSLog(@"%f", self.view.frame.origin.y); 
     self.view.frame = CGRectMake(0,-368,320,400); 
     [UIView commitAnimations]; 

     self.tdModal2 = [[TDSemiModalViewController2 alloc]init]; 


     // [self.view addSubview:test.view]; 

     [self presentSemiModalViewController2:self.tdModal2]; 
} 

-(void)moveBack{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.25]; 
    NSLog(@"%f", self.view.frame.origin.y); 
    self.view.frame = CGRectMake(0,368,320,400); 
    [UIView commitAnimations]; 
} 

그리고 모달 뷰에서

: 나는 다음과 같은 권장 사항을 제공

-(IBAction)cancel:(id)sender{ 
    [self dismissSemiModalViewController:self]; 
    FooterViewController *foot = [[FooterViewController alloc]init]; 
    self.footer = foot; 
// self.footer.view.frame = CGRectMake(0,35,320,400); 
    [self.footer moveBack]; 

} 
+0

내가 당신의 코드가 잘못이라고 생각, 당신은 취소 방법에 새로운 FooterViewController을 만드는,하지만 당신은 모든보기에 할당되지 않습니다 또는 자동으로 할당 된 경우 마치 새로운 것 인 것처럼 원래의 원점에서 생성됩니다. 같은 바닥 글이 아니에요. 이전에 애니메이션으로 찍은 것. – htafoya

+0

또한 iOS 4.0 이상에서는 [UIView beginAnimations]를 사용하지 않는 것이 좋습니다. 대신 블록 기반 애니메이션 방법을 사용하여 애니메이션을 지정해야합니다. – htafoya

+0

@htafoya 흠. 필자가 본 대부분의 예제는이를 사용했습니다. 또한 문제에 대한 '솔리드'솔루션이 있습니까? – 128keaton

답변

1

, 그들은 당신을 위해 좋은 수 있습니다 여기에 내가 사용하고있는 코드입니다.

주 1,

번역이 같은 점에 항상 같은 측정 항상 경우의 AffineTransform, 나는 CGAffineTransformMakeTranslation(<#CGFloat tx#>, <#CGFloat ty#>)를 사용하는 대신 뷰의 프레임을 수정 권하고 싶습니다. 이 메소드는 뷰를 얼마나 많이 움직일지를 지정합니다. 원래의 위치로 뷰를 반환하는 방식

물론 각 애니메이션 블록 내부 view.transform = CGAffineTransformIdentity.

이들 모두 일만큼 간단하다.

주 2, 당신은 단지 뷰의 원점을 이동하면 다음 추천하는 것입니다 기원을

를 이동하는 CGPoint 사용 :

CGRect hiddenFrame = self.view.frame; 
hiddenFrame.origin.y -= 736; 
self.view.frame = hiddenFrame; 

또는

CGRect hiddenFrame = self.view.frame; 
hiddenFrame.origin.y = -368; 
self.view.frame = hiddenFrame; 

또는

CGRect hiddenFrame = self.view.frame; 
hiddenFrame.origin = CGPointMake(0,-368); 
self.view.frame = hiddenFrame; 

뒤로 이동에 대해 동일합니다. 더 많은 코드가 있지만 이해하기 쉽습니다.

주 3, UIView의 애니메이션 차단

당신은 새로운 블록을 사용한다 :

[UIView animateWithDuration: 0.25 animations: ^(void) { 
     //animation block 
}]; 

등 지연, 완료 블록,

같은보다 방법과 다른 블록이 있습니다 옵션, 대의원 또는 참조 전달

당신이 당신의 모달 컨트롤러를 만들 현재 컨트롤러의 참조를 전달 :

self.tdModal2 = [[TDSemiModalViewController2 alloc]init]; 
self.tdModal2.delegate = self; 

당신은 TDSemiModalViewController2.h에 해당 속성을 선언해야합니다.교차 수입을 피하기 위해 @class FooterViewController을 선언하십시오. 프로토콜을 만들고 그 속성을 id<myModalProtocol>으로 선언함으로써 FooterViewControllermoveBack 메서드로 프로토콜을 구현해야합니다. 또는 속성을 id으로 신고하고 [self.delegate performSelector: @selector(moveBack)]으로 전화하십시오. 그런 다음

취소 방법, 간단하게 수행

[self dismissSemiModalViewController:self]; 
[self.delegate moveBack] //or performSelector.. in the third option case 
+1

이것은 훌륭하게 작동했습니다! – 128keaton

+0

나는 그것을 기쁘게 생각한다. :) – htafoya