2

사용자 정의 애니메이션을 사용하여 내 맞춤형 UIViewController ("temp"라고 함)을 제공합니다.내 UIViewController가 두 번로드되는 이유는 무엇입니까? iOS7

[temp setModalPresentationStyle:UIModalPresentationCustom]; 
temp.transitioningDelegate = self; 
[temp.view setHidden:YES]; 
[self presentViewController:temp animated:YES completion:nil]; 

내 사용자 정의 애니메이션은 화면의 왼쪽 상단 위치로 오른쪽에서 모달 뷰를 제시하십시오 UIVC가 호출됩니다. 사용자가 애니메이션을 볼 수 없도록 숨겨져 있습니다. SCREEN_HEIGHT (768) 위치에 도달하면 화면에 설정되고 가운데에서 위쪽에서 아래쪽으로 움직이는 (움직이는) 애니메이션이 적용됩니다. 목표는 위에서 아래로보기를 제시하고 위에서 아래로 (영화 장면과 같이) 닫는 것입니다.

- (void)animateTransition:(id)transitionContext 
{ 
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 
    NSLog(@" fromViewController %@ ",fromViewController); 
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 
    NSLog(@" toViewController %@ ",toViewController); 
    UIView *containerView = [transitionContext containerView]; 
    if (self.presenting) 
    { 
     // set starting rect for animation toViewController.view.frame = [self rectForDismissedState:transitionContext]; 
     [containerView addSubview:toViewController.view]; 
     [UIView animateWithDuration:0.5 
         animations:^{ 

          toViewController.view.frame = CGRectMake(-self.customSize.width, self.yValue, self.customSize.width, self.customSize.height); 
         } 
         completion:^(BOOL finished) 
     { 
      //HERE IS THE PROBLEM!!! 
      [toViewController.view setHidden:NO]; 
      [UIView animateWithDuration:[self transitionDuration:transitionContext] 
           animations:^{ 
            CGRect variable = [self rectForPresentedState:transitionContext]; 
            CGRect fitToCurrentScreenResolution = CGRectMake(0, 0, variable.size.width, variable.size.height); 
            toViewController.view.frame = fitToCurrentScreenResolution; 

           } 
           completion:^(BOOL finished) 
       { 
        [transitionContext completeTransition:YES]; 
       }]; 
     }]; 
    } 
    else 
    { 
     [UIView animateWithDuration:[self transitionDuration:transitionContext] 
         animations:^{ 
          fromViewController.view.frame = [self rectForDismissedState:transitionContext]; 
         } 
         completion:^(BOOL finished) 
     { 
      [transitionContext completeTransition:YES]; 
      [fromViewController.view removeFromSuperview]; 
     } 
     ]; 
    } 
} 

그리고 여기에 솔루션입니다 :이 코드는 작동하지 않는 하나입니다

- (void)animateTransition:(id)transitionContext 
{ 
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 
    NSLog(@" fromViewController %@ ",fromViewController); 
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 
    NSLog(@" toViewController %@ ",toViewController); 
    UIView *containerView = [transitionContext containerView]; 
    if (self.presenting) 
    { 
     // set starting rect for animation toViewController.view.frame = [self rectForDismissedState:transitionContext]; 
     [containerView addSubview:toViewController.view]; 
     [UIView animateWithDuration:0.5 
         animations:^{ 

          toViewController.view.frame = CGRectMake(-self.customSize.width, self.yValue, self.customSize.width, self.customSize.height); 
         } 
     ]; 

     [toViewController.view setHidden:NO]; 
     [UIView animateWithDuration:[self transitionDuration:transitionContext] 
         animations:^{ 
          CGRect variable = [self rectForPresentedState:transitionContext]; 
          CGRect fitToCurrentScreenResolution = CGRectMake(0, 0, variable.size.width, variable.size.height); 
          toViewController.view.frame = fitToCurrentScreenResolution; 

         } 
         completion:^(BOOL finished) 
     { 
      [transitionContext completeTransition:YES]; 
     }]; 
    } 
    else 
    { 
     [UIView animateWithDuration:[self transitionDuration:transitionContext] 
         animations:^{ 
          fromViewController.view.frame = [self rectForDismissedState:transitionContext]; 
         } 
         completion:^(BOOL finished) 
     { 
      [transitionContext completeTransition:YES]; 
      [fromViewController.view removeFromSuperview]; 
     } 
     ]; 
    } 
} 

내 질문은 간단하다. UIVC가 두 번이나 발표되는 이유는 무엇입니까? 나는 내 사용자 지정 UIVC 게으른로드하지만 내 응용 프로그램 충돌이 UIVC = 전무는 모달 제시 될 수 없다는 것입니다 속성을 만드는 시도

내가 해킹을 사용할 수도 있지만, 나는 왜 그것이 일어나고 있는지 알지 못할 것이다. 지금까지는 애니메이션이 완료 BLOCK에 들어가면 뷰를 다시 호출하는 것으로 보입니다.

애플 문서 말 : 애니메이션 시퀀스가 ​​종료하면

블록 오브젝트가 실행된다. 이 블록에는 반환 값이없고 은 완료 핸들러가 호출되기 전에 애니메이션이 실제로 완료되었는지 여부를 나타내는 단일 부울 인수를 취합니다. 애니메이션의 지속 시간이 0이면 이 블록은 다음 실행 루프 사이클의 시작에서 수행됩니다. 이 매개 변수는 NULL 일 수 있습니다.

다음 실행주기가 시작된 이래로 뷰가 그려지고 있습니까? 참고 :보기가 두 번 표시되고 있다고해도 viewDidLoad 메서드는 한 번만 호출됩니다.

왜 이런 일이 일어나고 있는지 알고 싶습니다. 동일한 코드를 사용하지만 작동 솔루션이나 설명이없는 동일한 문제가있는 사용 시나리오가있는 스택 오버 플로우 관련 질문이 있습니다.

조언/의견을 주셔서 감사합니다.

+0

안녕하세요. 체크인하고 있습니다. 이 문제에 대한 해결책을 찾았습니까? 나는 방금 비슷한 문제로 4 일간의 투쟁을 끝냈다. 귀하가 게시 한 코드가 귀하의 문제를 해결 한 "... 그리고 여기 해결책은 무엇입니까?"실제 코드입니까? –

+1

예 코드는 iOS7에서 제대로 작동했지만 iOS8에서는 제대로 작동하지 않았습니다.작동하지 않는 코드 예제와 같이 연결된 애니메이션은 사용자 정의 전환이 발생할 때 문제를 발생시키는 것으로 보입니다. 나는 그것이 대부분의 사람들이 사용하는 커스텀 트랜지션 코드 예제 때문에 발생한다고 생각한다. 보기가 어딘가에 두 번 apearing입니다. 한 번만로드되기 때문에 두 가지 모두에 적용되는 솔루션은 viewDidLoad에 SKView를 추가하는 것이 었습니다. 결국 저를위한 속임수였습니다. –

+0

@ banana_developer_4_iDrioid, 너무 빨리 설명해 주셔서 감사합니다! 당신이 일을 찾았다는 소식을 듣고 기쁘게 생각합니다. 정확한 원인을 찾아 내서 알아내는 것이 좋을 것 같습니다. 내 상황을 게시 할 것입니다. 누군가 다른 사람을 묶을 수도 있습니다 ... –

답변

0

아이폰 OS 8.0, 엑스 코드 6.0.1, ARC는 (O.P.에서 설명을 참조)

그래 당신은 definetely 그것에 "연쇄 애니메이션"에 있습니다

수 있었다.

내 응용 프로그램의 다양한 UIViewController에 대한 UIStatusBar를 숨기고 표시하려는 유사한 문제가 발생했습니다.로드 스크린과 동일한 이미지를 보여주는 UIViewController로드 후 더미가 있지만 추가 된 애니메이션이 있습니다.

나는 자신의 뷰를 추가하거나 제거하고 "to"UIViewController "control"을 할당하여 "from"UIViewController와 "to"UIViewController 로의 전환을 처리하는 UIViewController가있는 사용자 정의 트랜지션을 사용하고 있습니다. 그 자체. 이렇게.

위임자,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; 

"초기보기 컨트롤러"를 인스턴스화 한 다음 전환 UIViewController를 초기화해야했습니다. "to"UIViewController가 없으므로 UIViewController 전환은 UIViewController의 초기 UIView를 유지해야합니다. UIViewController는 전환이 트리거 될 때까지 초기화되었습니다. 이것은 활용 이루어졌다

, 최초 전환 후

self.window.rootViewController = self.transitionViewController; 
[self.window makeKeyAndVisible]; 

, 거기는 항상 두 개의 UIViews 서로를 입혔다. 그리고 두 개의 UIViewController 중 하나는 전환 중에 할당 된 전환 UIViewController의 현재 컨트롤로 존재하고 이전 UIViewController는 전환이 완료 될 때까지 남아 있습니다.

이것은 UIStatusBar를 표시/숨기기 위해 사용하려고했던 코드입니다. * 하나의 "컨트롤러 기반 상태 표시 줄보기"가 * -Info.plist 파일에서 "YES"로 설정되어 있어야합니다.

- (void)viewDidLoad 
{ 
    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; 
} 

- (BOOL)prefersStatusBarHidden 
{ 
    return false; 
} 

은 "반환"값이 "false"에서 "true"에 관계없이

[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; 

가 트리거 될 때의 기본에서 변경 될 때마다, 지연, 지연없이, 조건 등; 두 UIViewController, "to"및 "from"이 다시로드되었습니다. 처음에는 - (void) ViewDidLoad에서 트리거 된 UIViewController 중 하나에서 NSURLSession을 구현 한 후 눈에 띄지 않았습니다. 문제는 분명했다. 세션은 두 번 실행되었으며 관련 그래픽 콘텐츠도 업데이트되었습니다.

두 가지 방법으로 문제를 성공적으로 해결했지만 두 번째 문제는 계속 해결했습니다.

  1. 나는 모든 것을 넣습니다. - (void) ViewDidLoad; if 문에서 인스턴스 변수 boolean을 사용하여 한 번만 실행되도록했습니다. - (void) ViewDidLoad; 여전히 두 번로드되었지만 두 번 실행하지 않으려 고했던 내용은 그렇지 않았습니다.
  2. 전이 UIViewController를 사용하지 않고 UIStatusBar 숨김 상태를 변경해야하는 UIViewController로 전환되었습니다. UIStatusBar가 표시되거나 숨겨지면 앱의 'rootViewController'가 재설정됩니다. 위임, 다시 한번 전환 된 UIViewController를 항상 "표시된"것으로 지정합니다. https://stackoverflow.com/a/26403108/4018041

    감사 :

나는 다음 포스트에서이 작업을 수행하는 방법에 대해 설명합니다. 희망이 사람을 도움이됩니다. 앞으로 OP 나 나 자신을 위해 이것이 어떻게 처리 될 수 있는지에 대해 의견을주십시오.