2011-02-09 5 views
39

ビューのズームをピンチで実装することに成功しました。しかし、私が望んでいたところでは、ビュー自体はポジションにはなりません。 iPadを搭載したスタックオーバーフラワーについては、iPad Photos.appのようにビューを中心にしたいと思います。&をズームすると、写真が拡大表示されます。このビューは、最初の指の右上隅と他の指の下の左手指のほぼ中央に配置されています。私はそれをパンレコグナイザと混合しましたが、この方法では、ユーザーはいつもピンチしてパンして調整する必要があります。ここでUIPinchGestureRecognizerは、2本の指の間に挟まれたビューを配置します。

は、それは不明だ場合、私は初期のためにそう(秘密、私はiPadでのPhotos.appを再現しようとしている...)

を私のアプリのビデオを投稿することができ、そのグラフィックの説明です指の位置、ズーム初め:これは、現在の実際の「ズーム」フレームである

enter image description here

を。正方形は大きいですが、位置は指ここ

given the start position

を下回っていることは、私が持っているしたいものです:同じサイズが、異なるorigin.xとy:

enter image description here

(私の貧弱なフォトショップスキルについては申し訳ありません^^)

+0

HI Thomas、私もそれに非常に興味があります。あなたはそれについて何か解決策を見つけましたか?サンプルコードはありますか? thx〜 – ludo

+2

私はこの問題に戻る時間がなかったが、@md_developの答えは素晴らしいようだ。私はコードを更新し、これがうまくいけば答えを受け入れる時間を見つけようとします。 –

答えて

41

あなたは方法handlingPinchGestureに次のコードを介して2本の指の間の中間点のCGPointを得ることができます。

CGPoint point = [sender locationInView:self]; 

私の全体のhandlePinchGestureの方法は以下の通りです。

/* 
instance variables 

CGFloat lastScale; 
CGPoint lastPoint; 
*/ 

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)sender { 
    if ([sender numberOfTouches] < 2) 
     return; 

    if (sender.state == UIGestureRecognizerStateBegan) { 
     lastScale = 1.0; 
     lastPoint = [sender locationInView:self]; 
    } 

    // Scale 
    CGFloat scale = 1.0 - (lastScale - sender.scale); 
    [self.layer setAffineTransform: 
     CGAffineTransformScale([self.layer affineTransform], 
           scale, 
           scale)]; 
    lastScale = sender.scale; 

    // Translate 
    CGPoint point = [sender locationInView:self]; 
    [self.layer setAffineTransform: 
     CGAffineTransformTranslate([self.layer affineTransform], 
            point.x - lastPoint.x, 
            point.y - lastPoint.y)]; 
    lastPoint = [sender locationInView:self]; 
} 
+1

にはこれが必要でした。[送信側locationInView:self]が常に同じポイントを2つのピンチフィンガーの中間点として返すと、どのように動作するのですか? – Guy

+1

指を離したり近づけたりするため、 'UIGestureRecognizerStateBegan'の後に@Guy中点が変化しています。 'locationInView:self'は2本の指の間の重心を返します。その部分はうまくいく。 1時間後でもまだ私は移動する必要がある層の束を持っている私のアプリで動作するようにこれを得ることはできません。 –

+1

私はこのメソッドを使用し、ビューが正しく変換されます。しかし、翻訳された方法はPhoto appのように滑らかではありません –

11

Touches sample projectをご覧ください。具体的にこれらのメソッドはあなたを助けることができる:

// scale and rotation transforms are applied relative to the layer's anchor point 
// this method moves a gesture recognizer's view's anchor point between the user's fingers 
- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { 
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { 
     UIView *piece = gestureRecognizer.view; 
     CGPoint locationInView = [gestureRecognizer locationInView:piece]; 
     CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview]; 

     piece.layer.anchorPoint = CGPointMake(locationInView.x/piece.bounds.size.width, locationInView.y/piece.bounds.size.height); 
     piece.center = locationInSuperview; 
    } 
} 

// scale the piece by the current scale 
// reset the gesture recognizer's rotation to 0 after applying so the next callback is a delta from the current scale 
- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer 
{ 
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer]; 

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) { 
     [gestureRecognizer view].transform = CGAffineTransformScale([[gestureRecognizer view] transform], [gestureRecognizer scale], [gestureRecognizer scale]); 
     [gestureRecognizer setScale:1]; 
    } 
} 
+0

ありがとうございます。しかし、 'view.transform'を使って私のサブビューのサイズを変更します...それを防ぐ手段はありますか? –

+0

#import - アンカーポイント –

関連する問題