2011-10-07 4 views
9

내 iPad 앱에는 작은 테이블보기가있는보기 컨트롤러가 있습니다. 테이블 뷰를 탭하면 작은 테이블 뷰의 더 크고 세련된 버전 인 모달 뷰 컨트롤러가 열립니다. 대규모 테이블 컨트롤러의 미리 렌더링 된 이미지에서 이미지를 작은 테이블 뷰의 크기로 축소 한 다음 전체 화면 크기로 확대 한 다음 이미지를 "실제"뷰로 대체하여 애니메이션을 만들고 싶습니다. 제어 장치.확대/축소하여 UIViewController를 어떻게 표시합니까?

뭔가 같은 :

LargeViewController* lvc = [[LargeViewController alloc] init]; 
[self presentModalViewController:lvc byZoomingFromRect:CGRectMake(50,50,200,300)]; 

난 당신이보기에서 이미지를 생성 할 수 있습니다 알고

- (UIImage *) imageWithView:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return img; 
} 

하지만 어떻게 내가보기 컨트롤러 무승부 (오프 스크린) 자체를 만들 수 있죠 그래서 나는 그것의 걸릴 수 있습니다 화면을 채우기 위해 애니메이션에서 이미지보기 및 크기 조정?

미리 감사드립니다.

답변

3

아주 독특한 애니메이션을 만들고 싶습니다. 지난 달에 나는 그와 비슷한 것을 가지고 놀았습니다. 내 솔루션은 현재보기에 오버레이로 사용자 지정보기 (보기 컨트롤러에서 가져온 것일 수도 있음)를 추가하는 것이 었습니다. 레이어와도 작동합니다.

먼저 위의 코드 예제에서와 같이 "미래"또는 "현재"보기 컨트롤러에서 이미지를 가져옵니다. 일반적으로 컨텍스트에 렌더링하는 동안 뷰 컨트롤러 컨텐트를 사용할 수 있어야합니다.

이제 이미지가 생겼습니다. 이미지 조작은 당신이해야합니다.

이미지를 UIImageView에 추가하십시오. 이 ImageView는 하위 뷰 또는 레이어로 추가 될 수 있습니다. 이제 실제 사용자 인터페이스 위에 자유롭게 그릴 수있는 레이어가 있습니다. 때로는 레이어 또는보기를 이동해야하므로보기가 완벽하게 오버레이됩니다. 이는보기 설정에 따라 다릅니다. Tableviews를 다루는 경우, 하위 뷰를 추가하는 것은 쉽지 않습니다. 따라서 레이어를 더 잘 사용하십시오.

모든 작업이 끝나면 즉시 애니메이션이 표시되지 않도록 새보기 컨트롤러를 표시합니다.

작업이 완료된 후 부모보기에서 레이어 또는보기를 제거하고 정리하십시오.

이 작업은 복잡해 보이지만 일단 작업을 완료하면 템플릿을 사용할 수 있습니다. "WWDC 2011, Session 309 Interface Builder Storyboarding 소개"에서 Apple은 '원하는 맞춤 구문'을 소개했습니다. 여기서는 원하는 작업을 정확하게 찾을 수 있습니다. 아래의 코드는 이전 프로젝트에서 삭제 된 것으로 여하튼 엉망이며 정리해야합니다. 그러나 원리를 보여주기 위해 이것은 작동해야합니다 :

-(void) animate { 

     static LargeViewController* lvc = [[LargeViewController alloc] init]; 

     UIGraphicsBeginImageContextWithOptions(self.bounds.size, view.opaque, [[UIScreen mainScreen] scale]); 
    [lvc.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

     // Create a ImageView to display your "zoomed" image 
     static UIImageView* displayView = [[UIImageView alloc] initWithFrame:self.view.frame]; 
     static UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     // Add your image to the view 
     displayView.image = img; 

     // insert the view above your actual view, adjust coordinates in the 
     // frame property of displayView if overlay is misaligned 
     [[self.view] addSubview:displayView]; 

     // alternatively you can use the layer 
     // [self.view.layer addSublayer:displayView.layer]; 

     // draw the imageView 
     [displayView setNeedsDisplay]; 

     // do something in background. You may create your own 
     // construction, i.e. using a timer 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

      NSDate *now = [NSDate date]; 
      NSTimeInterval animationDuration = 3.; 
      NSTimeInterval t = -[now timeIntervalSinceNow]; 
      while (t < animationDuration) { 

       t = -[now timeIntervalSinceNow]; 

       // Do some animation here, by manipulation the image 
       // or the displayView 

       // <calculate animation>, do something with img 
       // you have exact timing information in t, 
       // so you can set the scalefactor derived from t 
       // You must not use an UIImage view. You can create your own view 
       // and do sth. in draw rect. Do whatever you want, 
       // the results will appear 
       // in the view if you added a subview 
       // or in a layer if you are using the layer 

       dispatch_sync(dispatch_get_main_queue(), ^{ 

        // display the result 
        displayView.image = img; 
        [displayView setNeedsDisplay]; 
       }); 
      } 
     }); 

     // now the animation is done, present the real view controller 
     [self presentModalViewController:lvc animated:NO]; 

     // and clean up here 
} 
+0

마침내 당신의 매우 상세한 제안을 시험 할 시간이있었습니다. 매력처럼 작동합니다! 귀하의 의견을 보내 주셔서 감사합니다. 또한 WWDC 2011 세션 309는 커스텀 스팽글을 사용하여 효과적이었을 것입니다. –

0

아마 당신은 당신의 부모 뷰 컨트롤러, 후 현재 LVC 모달에서보기의 축소 버전을 포함하고 사용자가보기를 탭하면 규모를 복원

CGAffineTransform tr = CGAffineTransformScale(lvc.view.transform, 0.5, 0.5); 

같은 것을 사용할 수 있습니다.

0

UIKit이 대부분을 처리합니다. jbat100의 솔루션도 작동하도록 만들 수 있지만, lvc의 초기 프레임을 시작하려는 작은 사각형으로 설정 한 다음 프레임을 전체 크기로 설정하면 암시 적 애니메이션 프레임을 변경하면 확대/축소 애니메이션이 처리됩니다. 각 UIView에는 그 내용이 그려지는 CALayer가 있으며 그 레이어에는 프레임 또는 위치 속성과 같은 특정 속성에 대한 애니메이션 된 변경 사항을 설정하는 몇 가지 암시 적 애니메이션 설정이 있습니다. performSelector:withObject:afterDelay 호출 setFrameToFullScreen이 다음 실행 루프 사이클에서 호출하게됩니다

 . 
     . 
    lvc.view.frame = CGRectMake(50,50,200,300); 
    [self performSelector:@selector(setFrameToFullScreen) withObject:nil afterDelay:0]; 

} 

- (void)setFrameToFullScreen { 
    lcv.view.frame = [UIScreen mainScreen].bounds; 
} 

: 여기에 내 테스트되지 않은 자상이다. 이와 같이하지 않으면 최종 프레임 만 사용되며 시스템은 프레임의 변경 사항을 인식하지 않고 암시 적 애니메이션을 뷰 레이어에 적용합니다.

+0

문제는 뷰 클래스가 아니기 때문에 뷰 컨트롤러에 프레임 속성이 없다는 것입니다. 뷰 컨트롤러를 표시하는 유일한 방법은 presentModalViewController : animated : 메서드를 사용하는 것이며 그 메서드는 애니메이션 자체를 설정합니다. –

+0

맞아! 뷰 컨트롤러에는 프레임이 없지만 프레임은 볼 수 있습니다. 이를 반영하기 위해 위 코드를 편집했습니다. – Logachu

관련 문제