6

ユーザーがウィンドウの側面からパネルを引き出すことができるアニメーションを作成しようとしています。ビューの一部が右上に表示され、それを引っ張るとビューが外側に回転し、画面の右下に固定されます。うまくいけば、これらの画像は私が達成したいことを示しています (右側の紙のシートは、ビューの一部が非表示になることを示しています。スワイプやタップではなく、ユーザーがドラッグできるようにしたいと考えています。

これを達成する方法について、誰かが私を正しい方向に向けることができますか? 私はiOSでのアニメーションにはかなり慣れていません。パン ジェスチャが機能するようになりましたが、回転するにはこのポイントが必要です。ビューの.centerプロパティを設定できますが、そうするとビュー全体がそのポイントに移動するだけなので、center実際にはビューの中央ではない回転元が必要だと思いますか?

ここに画像の説明を入力 ここに画像の説明を入力

編集:動作するメソッドを作成しましたが、ビューがユーザーの指に「くっついて」いません。指をドラッグして、たとえば 45 度回転させることはできますが、ビューはそれ以上移動します。それらを同期する方法がわからないのですが、何かアイデアはありますか?

- (void) swipeSidebarOpen: (UIPanGestureRecognizer *) recognizer {
    //[self openOrCloseSideBar: YES];
    _sidebarView.layer.anchorPoint = CGPointMake(1.0, 1.0);
    _sidebarView.layer.position = CGPointMake(510, 330);

    UIView *shuttle = [recognizer view];

    if ([recognizer state] == UIGestureRecognizerStateBegan || [recognizer state] == UIGestureRecognizerStateChanged) {
        CGPoint vel = [recognizer velocityInView:[recognizer view]];

        if (vel.x > 0) {
            [recognizer view].transform = CGAffineTransformRotate([[recognizer view] transform], M_PI / 80.0f);
            [recognizer setTranslation: CGPointZero inView:[shuttle superview]];
        } else {
            [recognizer view].transform = CGAffineTransformRotate([[recognizer view] transform], -M_PI / 80.0f);
            [recognizer setTranslation: CGPointZero inView:[shuttle superview]];
        }
    }
}
4

3 に答える 3

3

少し遅れましたが、指 1 本でパン、ズーム、スケールを処理するコードを書きました。標準的なジェスチャーは、微調整された作業やタクシーの後部で跳ね回るには、ある程度の精度がありません。

この 2 つのことは、あなたに少し役立つかもしれません。回転ジェスチャー ターゲット メソッドは、ピンチ レコグナイザーまたはパンから受け取ることができます。ただし、現在のポイントとジェスチャの開始ポイントの間の角度を計算するため、パン レコグナイザーの最初のタッチ ポイントがどこにあるかを追跡する必要があります。画面中央も保存する必要があります。私にとっては、これらすべての点をウィンドウの座標系に入れているので、使用したい点を選んでそれに固執する必要があります。

CGFloat /* midpoint, startpoint, point */
CGPointAngleATan2(CGPoint mp, CGPoint sp, CGPoint p)
{
    CGFloat angle = 0;
    CGFloat sAngle = atan2(sp.y-mp.y,sp.x-mp.x);
    CGFloat pAngle = atan2(p.y-mp.y,p.x-mp.x);
    angle = pAngle-sAngle;
    return angle;
}


- (CGFloat)calculateRotation:(UIGestureRecognizer *)sender;
{
    CGFloat rotation;

    if ([sender respondsToSelector:@selector(rotation)]){
        rotation = [(UIRotationGestureRecognizer *)sender rotation];
    } else {
        // convert to window co-ordinates, app specific so change if needed
        CGPoint point = [sender locationInView:self.view.window];
        rotation = CGPointAngleATan2(screenCenter,firstTouch,point);
    }
    return rotation;
}
于 2013-09-11T21:26:08.557 に答える
1

デフォルトでは、ビューはその中心を中心に回転しますがanchorPoint、ビューに別の設定をすることで変更できますlayer。(そのためには Core Animation をインポートする必要があります (QuartzCore.framework))。

アンカー ポイントは正規化されます (X と Y の両方が 0 から 1 になります)。デフォルトでは中央(0.5、0.5)ですが、右下隅(1.0、1.0)に変更したいと考えています。

myView.layer.anchorPoint = CGPointMake(1.0, 1.0);

anchorPoint を変更すると、ビューが画面上で視覚的に移動positionし、スーパービューのビュー レイヤーがビューが回転するポイントと同じになるようにします。

myView.layer.position = theFixedHerePoint; // The point you are showing in your drawing...

例: スーパービューが (0,0) から (100, 100)に移動する場合、myView の は、myView の中心ではなく、右下隅があるべきpositionポイントである必要があります。下の図のように (X は anchorPoint (1, 1) と位置 (95, 95))。95 は単なる任意の値であることに注意してください。

┌───────────────────┐
│ superview         │
│                   │
│      ┌──────────┐ │
│      │ myView   │ │
│      │          │ │
│      │          │ │
│      └──────────X │
└───────────────────┘

パンすると、適切な回転変換を設定するだけで、ビューが右下隅を中心に回転します。

于 2012-11-30T12:34:30.323 に答える
0

パンするときに行う必要があるのは、パンジェスチャ レコグナイザーのハンドラーで、パンするビューに回転変換を適用する必要があることです。のようにself.SomeView.transform = CGAffineTransformMakeRotation(some rotation)。適用する回転量を計算する必要があります。中心を設定する場合も同様です。

于 2012-11-30T12:08:31.510 に答える