2011-12-08 15 views
4

1つのビューを2つのパートに分割し、上の部分を上にアニメーションし、下の部分を下にアニメーション化してその背後のビューを表示すると、トランジション効果を開発しようとしています。 は、私はそれを達成するためのUIViewとUIImageViewのアプローチを使用しています:UIViewを2つの部分にレンダリングする方法

// 1. Make a screenshot: 
    UIGraphicsBeginImageContext(parentView.frame.size); 
    [parentView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    // 2. Calculate rectangles for top and bottom part: 
    CGRect rectTop, rectBottom; 
    CGFloat W = rectBig.size.width; 
    CGFloat H = rectBig.size.height; 


    rectTop = CGRectMake(0, 0, W, y_cutoff); 
    rectBottom = CGRectMake(0, y_cutoff, W, H - y_cutoff); 

    // 3. Create top and bottom images: 
    CGImageRef imageRefTop  = CGImageCreateWithImageInRect([screenshot CGImage], rectTop); 
    CGImageRef imageRefBottom = CGImageCreateWithImageInRect([screenshot CGImage], rectBottom); 


    UIImage *imageTop = [UIImage imageWithCGImage:imageRefTop]; 
    UIImage *imageBottom = [UIImage imageWithCGImage:imageRefBottom]; 


// 4. Assign images to image views: 
imageViewTop.image = imageTop; 
imageViewBottom.image = imageBottom; 

// 5. Animate image views: 
[UIView beginAnimation:nil context:NULL]; 
.... animation code here 
[UIView commitAnimations]; 

しかし、このコードは、デバイス上で非常に遅く、私は、そのような移行を実現するためのより効率的な方法があると確信しています。おそらくCALayersなどを使用しています。 正しい方向に向けることができますか?

+1

「極端に遅い」とはどういう意味ですか?インストゥルメントはどこに時間を費やしていると言いますか? –

+0

正面図をクリックすると、トランジションが発生します。クリック後、目立つ遅延があり、アニメーションそのものがぎこちない(iPhone 4でテスト済み)。 – Lukasz

答えて

2

これはアニメーションではありません。あなたの描画コードが遅いです。プロファイルすると、renderInContext:(btwは常にメインスレッドで実行されます)とCGImageCreateWithImageInRectが制限要因になります。あなたの意見(あなたが分割したいもの)は何についてですか?開始から1つではなく2つのビューを作成するオプションですか?

+0

あなたは正しいです。プロファイリングは、renderInContextメソッドで多くの努力をしています。しかし、私の見解は、UIScrollViewを使ってグリッドメニューのいくつかの王様として分けることはできません。ユーザーがタップすると、ダイナミックポイント(タッチポイント)で分割されます。 – Lukasz

2

アニメーション自体が遅くなることはありません。実際に行う必要があるのは、アニメーションの2つのビューのY位置を変更することだけです。

なぜ静的イメージをUIImageViewsに入れてアニメーションの実行方法を見てみませんか?

イメージを作成しているときに遅延が発生している場合は、メインスレッドがフリーズしないように、そのコードを別のスレッドに移動することを検討する必要があります。イメージの作成が完了したら、メインスレッドに通知し、それらをUIImageViewsに入れ、アニメーションを実行します。

関連する問題