2011-10-07 16 views
9

iPad uygulamasında, küçük bir tablo görünümünde bir görünüm denetleyicim var. Tablo görünümüne dokunduğunuzda, küçük tablo görünümünün daha büyük ve daha rafine bir versiyonu olan bir modal görünüm denetleyicisi açar. Görüntüyü küçük tablo görüntüsünün boyutu olacak şekilde küçülterek ve daha sonra "gerçek" görünümle değiştirerek, büyük görüntü denetleyicisinin önceden oluşturulmuş görüntüsünden bir animasyon oluşturmak istiyorum. kontrol ünitesi.Yakınlaştırırken UIViewController'ı nasıl sunarım?

şey gibi:

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

Sana bir görünümden bir görüntü üretebilir biliyorum:

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

Ama nasıl görünüm denetleyicisi beraberlik (ekran dışında) kendisi yapabilirim yüzden bu kadar alabilir Ekranı doldurmak için görüntüyü bir animasyonda görüntüleyin ve ölçeklendirin?

Şimdiden teşekkürler.

cevap

3

Sanırım kendi animasyonunuzu oluşturmak istiyorsunuz. Geçen ay böyle bir şeyle oynadım. Çözümüm, mevcut görünüme bir üst görünüm olarak özel bir görünüm (belki bir denetleyiciden alınmış) ekliyordu. Bu da katmanlarla çalışır.

İlk önce, yukarıdaki kod örneğinizde yaptığınız gibi, görüntüyü "gelecekteki" veya "şimdiki" görünüm denetleyicinizden alırsınız. Normalde, içerik denetlenirken görünüm denetleyicilerinin içeriği kullanılabilir olmalıdır.

Şimdi resme sahipsiniz. Görüntünün manipülasyonu sizin tarafınızdan yapılmalıdır.

Resmi bir UIImageView'e ekleyin. Bu ImageView, alt görünüm veya katman olarak eklenebilir. Artık gerçek kullanıcı arayüzünüzü özgürce çizebileceğiniz bir katman var. Bazen katmanı hareket ettirmeniz veya etrafınıza bakmanız gerekir, böylece görüşünüzü mükemmel bir şekilde kaplar. Bu, görünüm ayarlarınıza bağlıdır. Tablo Görüntülemeleri ile ilgileniyorsanız, bir alt görünüm eklemek o kadar kolay değildir. Bu yüzden tabakayı daha iyi kullanın.

Tüm çalışmalar tamamlandıktan sonra, yeni görünüm denetleyicisini animasyon olmadan sunun, böylece hemen görünecektir.

İş tamamlandıktan sonra katmanı veya görünümü ana görünümden kaldırın ve temizleyin.

Bu karmaşık görünüyor, ancak yaptıktan sonra bunun için bir şablonunuz olduğunu. "WWDC 2011, Session 309 Arayüz Oluşturucu Hikâyeciliğinin Tanıtımı" adlı Apple'da, tam olarak ne yapmak istediğinize dair bir mekanizma bulacağınız 'özel seğmenler' tanıtıldı. Aşağıdaki kod, eski bir projeden kesilmiştir ve bir şekilde dağınıktır ve temizlenmelidir. Ancak bu prensibi göstermek için aşağıdakiler çalışmalıdır:

-(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

Sonunda, çok detaylı önerilerinizi test etmek için zamanımız oldu. ÇALIŞIYOR bir cazibe gibi! Girişiniz için çok teşekkürler! Ve ayrıca, özel sekeller ile WWDC 2011 oturumu 309 da harika çalıştı. –

0

Belki de ana görünümü denetleyicisi, daha sonra mevcut LCV modally bakış bir küçültülmüş versiyonu gömmek ve kullanıcı görünümü dokunduğunda ölçeği geri

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

gibi bir şey kullanabilirsiniz.

0

UIKit sizin için bununla ilgilenir. Jbat100'ün çözümü de işe yarayabilirken, lvc'un başlangıç ​​karesini başlangıçta başlatmak istediğiniz daha küçük doğrultuya ayarlayarak ve daha sonra çerçevenin tam boyutunu, örtülü animasyonunu ayarladığınızda bunu yapabilmeniz gerekir. çerçeve değiştirmek için sizin için yakınlaştırma animasyonunu ele alacaktır. Her UIView, içeriğinin çizildiği bir CALayer'a sahiptir ve bu katmanın, çerçeve veya konum özellikleri gibi belirli özelliklerde animasyonlu değişikliklere ayarlanan birkaç örtük animasyonu vardır. performSelector:withObject:afterDelay çağrı setFrameToFullScreen sonraki çalıştırma döngüsüne çağrılacak neden olur

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

} 

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

: İşte ona benim denenmemiş bıçak olduğunu. Böyle bir şey yapmazsanız, yalnızca son kare kullanılır ve sistem çerçevedeki değişikliği tanımaz ve örtülü animasyonunu görünüm katmanına uygular.

+0

Sorun, bir görünüm denetleyicisinin bir görünüm sınıfı olmadığı için bir çerçeve özelliğine sahip olmamasıdır. Görünüm denetleyicisini görüntülemek için bildiğim tek şey, presentModalViewController: animated: yöntemini kullanmaktır ve bu yöntem animasyonu kendisi belirler. –

+0

Sağınız! Görünüm denetleyicinin bir karesi yok, ancak görünümü yok. Bunu yansıtmak için yukarıdaki kodu düzenledim. – Logachu

İlgili konular