8

今、私はUIScrollViewに一連のビューを設定しています。 UIScrollViewをカルーセルのように見せるには、ビューを歪ませる必要があります。つまり、ユーザーがスクロールすると、円のようにする必要があります。私はこれまで全く同じようなことをしたことはありませんが、CoreAnimationが問題になるとは思っており、OpenGLを使う必要があります。これがCoreAnimationやQuartzで可能なのであれば、ビューをワープする方法についてのサンプルが必要なだけで、残りの部分は自分で分かるはずですが、OpenGLに慣れていません。私の経験でCoreAnimationまたはOpenGLでカルーセル効果のビューをカーブ/ワープする

alt text

+1

100%確かではありませんが、私はあなたのビューのレイヤプロパティにCATransform3Dを適用できると思います。 – jessecurry

+0

ええ、私はこれについて少し読んでいますが、私はそれを実際に使用したことはありません。あなたはどんなサンプルも知っていますか? –

答えて

6

、価値が権利を取得する少しトリッキーです。ビューの視点を与える方法は、レイヤーの変換を操作することです。私は、同様の効果を得るためtransforを達成するために、以下の方法を使用しています

-(CATransform3D)makeTransformForAngle:(CGFloat)angle from:(CATransform3D)start{ 

    CATransform3D transform = start; 


    // the following two lines are the key to achieve the perspective effect 
CATransform3D persp = CATransform3DIdentity; 
    persp.m34 = 1.0/-1000; 

    transform = CATransform3DConcat(transform, persp); 
     transform = CATransform3DRotate(transform,angle, 0.0, 1.0, 0.0); 
    return transform; 
} 

これは、あなたが適応する必要があるかもしれませんので、「フリップページ」アニメーションを作成するために行われました。これを使用するには、次の操作を行います。

flip_page.layer.transform = [self makeTransformForAngle:angle from:CATransform3DIdentity]; 

flip_pageはUIViewです。乾杯!

+0

ありがとう!私の主な問題は、上記のように個々のビューをワープすることです。あなたはこれについてどうやって行くのか知っていますか? –

+2

私は参照してください。そのためにはもちろん、線形変換では不十分です。 OpenGLでメッシュを作成し、テクスチャをスラップできると確信しています。しかし、それは過剰なもののようです。私はこの質問が巧妙な答えになることを願っています;) – fsaint

+0

これは、私が個々のビューにパースペクティブを追加することを可能にします。しかし、彼らはまた歪んでいる必要があります。 –

15

ビューをワーピングする場合は、OpenGLが必要です。また、Core AnimationのCAShapLayerを使用して、このカーブを持つことができるベジェパスを指定することもできます。しかし、あなたが見ているこのカーブは、錯視の可能性が高いことを覚えておいてください(上の画像では実際のカーブのように見えます)。正しいY軸の回転が行内にある十分な矩形が得られたら、まっすぐなCore Animationで探している効果を思いつくことができると思います。数年前にAppleが提供したCore Animationデモでは、そのことがどのように実装されているのか、私は確信しています。ここではそのプレゼンテーションからビデオからのスクリーンショットです: Core Animation Layer Warping

私は、ビューのレイヤの少しを変換し、これを思い付いたと周りめちゃめちゃ:

- (IBAction)sliderDidChange:(id)sender 
{ 
    CGFloat value = [(UISlider*)sender value]; 
    CGFloat xOff = value - 0.5; 

    CATransform3D trans = CATransform3DIdentity; 
    trans.m34 = 1.0f/-1000.0f; 

    trans = CATransform3DRotate(trans, degreesToRadians(xOff * -25.0f), 0.0f, 1.0f, 0.0f); 
    trans = CATransform3DTranslate(trans, 0.0f, 0.0f, 900.0f * fabs(xOff)); 
    [[frameView layer] setTransform:trans]; 

    CGPoint center= [frameView center]; 
    [frameView setCenter:CGPointMake(1024.0 * value, center.y)]; 
} 

私は方法を示して一緒にa demo projectを投げました回転はスライダに応答して機能します。それはスクロールビューを使用しないので、それを適応させる必要がありますが、現在のスクロールオフセットを追跡してそれに応じて変換を適用できると思います。それが助けになるかどうかは分かりませんが、そこにはあります。

関連する問題