2012-07-17 1 views
0

나는 UINavigationController이고 몇 가지는 UIViewControllers입니다. 구현하고자하는 것은 2 개의 뷰 컨트롤러를 다시 터뜨리는 것입니다. 그러나 스택에있는 이전 컨트롤러가 원하는 것을 얻으려면 애니메이션으로 표시해야합니다 (이를 통해 진행). 이것이 내가 popToViewController:이 나를 위해 작동하지 않는 주된 이유입니다.여러보기 컨트롤러가 있지만 모두 표시하는 중

내가 플래그가 설정되어있는 경우 그래서, 뷰 컨트롤러가 viewDidAppear:popViewControllerAnimated:를 호출하는 모든 이전 UIViewControllers에 플래그를 설정하여 popViewControllerAnimated:를 호출하려고 또 다른 것은. 이것은 내가 원하는 것을 거의 제공하지만 애니메이션이 매끄럽지 않은 것을 좋아하지 않습니다. 애니메이션은 각 컨트롤러마다 속도가 느려지는 반면, 나는 모두 같은 속도로 전달되기를 바랍니다.

내가 생각하고있는 또 다른 접근법은 이러한 컨트롤러를 피하고 모든 것을 하나의 스크롤보기에 넣는 것입니다. 그러면 뷰 트랜잭션을 만드는 방법을 완전히 제어 할 수 있습니다.

아직도 내비게이션 컨트롤러로 할 수있는 것이 있는지 궁금합니다. 도움 주셔서 감사합니다.

답변

0

viewDidAppear:이 아닌 다른 기능을 구현하는 경우 원활한 애니메이션을 구현할 수 있을지 의심 스럽습니다. 예를 들어 3 가지가 있습니다. 3 번째로 튀어 나오고 동시에 시작합니다. 팝 애니메이션 (0.25? dunno, 테스트해라.)만큼 길다. (세 번째에서 두 번째로 접근하면 [self.navigationController viewControllers]을 통해 알 수있다.

스크롤 뷰의 모든 viewControllers (보기)에 대한 아이디어가 정말 마음에 들지 않습니다. - 너무 많은 메모리를 소비 할 수 있습니다. 할 수 있었다.

다른 옵션은 각 viewController에서 스크린 샷을 저장하는 것입니다. 매끄러운 팝 애니메이션 만 필요한 경우 viewController (백그라운드 스레드에서 viewController이 열리는 동안 각)에서 스크린 샷을 찍어 글로벌 scrollview imageSet에 추가 할 수 있습니다. 그런 다음 팝업이 표시 될 때 곧 스크롤 뷰를 표시하고 스크롤 뷰에서 이미지를 통해 애니메이션을 적용하면 viewControllers이 이미 viewController으로 팝되었습니다.

-

당신이 어떤 새로운 아이디어 :

+0

좋아, 내 앱의 이전보기 컨트롤러에서 내용이 정적 인 한 스크린 샷을 찍는 것이 좋았습니다. 나는 그것을 구현했고 나중에 누군가가 원할 경우를 대비해 여기에 해결책을 게시 할 것이다. 그리고 내가 시도 할 또 다른 것은 팝핑을위한 애니메이션 커브를 변경하는 것입니다 (가능하다면). –

0

을 가지고 희망 (일부 viewController 내용이 동적으로 변경하는 경우 사용자가 빠른 슬라이드 것과 이미 찍은 스크린 샷을 통지하지 않습니다대로, 중요하지 않을 수 있습니다) 좋아, 여기에 내가 다음 뷰 컨트롤러가,451에 밀려 때 UIViewController의 모양이 저장 될 경우 정의합니다 프로토콜 Screenshotable을 정의

  1. 을 구현하는 방법에 대한 세부 정보를의

    @protocol Screenshotable @property (strong, nonatomic) UIImage * 스크린 샷; @end

  2. Screenshotable 프로토콜을 구현할 때마다보기 컨트롤러가 프로토콜을 구현하고 @synthesize screenshot을 구현하게하십시오.아래 그림과 같이

  3. 는 이제 UINavigationViewController의 위임을 정의하고 다음 콜백을 구현합니다

    • (무효)있는 navigationController : (UINavigationController가 *)있는 navigationController willShowViewController : (UIViewController에 *)의 ViewController 애니메이션 : (BOOL) 애니메이션 { // 현재보기를 가져 오는 중 (그냥 푸시 된보기입니다.) 숨겨진 상태로 이전보기 컨트롤러를 화면에 표시하고 싶습니다. int index = [[navigationController viewControllers] count] - 1;

      // 첫 번째보기 컨트롤러인지 확인하고 아직 화면 캡처하지 않음 if (index < = 0) return;

      // 이전 항목 가져 오기 UIViewController * controller = [[navigationController viewControllerers] objectAtIndex : - index];

      //이 screenshotable 만약 스크린 샷 메이커 경우 ([컨트롤러 conformsToProtocol : @protocol (Screenshotable)]) { 아이디 screenshotable = (ID) 컨트롤러;

      if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
      { 
          UIGraphicsBeginImageContextWithOptions(self.window.bounds.size, NO, [UIScreen mainScreen].scale); 
      } 
      else 
      { 
          UIGraphicsBeginImageContext(self.window.bounds.size); 
      } 
      
      [self.window.layer renderInContext:UIGraphicsGetCurrentContext()]; 
      screenshotable.screenshot = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 
      

      } }

  4. 이제 새로운 컨트롤러가 밀어 직전 자신의 뷰 이미지를 저장합니다 Screenshotable 프로토콜을 구현 탐색 스택의 모든 UIViewControllers. 당신이 모두를 통해 돌아갈 때마다 컨트롤러에서 UIImages를 가져 와서 현재 컨트롤러에 추가하고 움직입니다. 애니메이션이 끝나면 [self.navigationController popToViewController : controller animated : NO];

그렇습니다.

관련 문제