2011-10-28 3 views
0

ピンチジェスチャー認識機能を画像ビューに追加してピンチを使用して写真を拡大/縮小します。以下は、私は、デリゲートメソッドで使用しているコードです:将来の変換のフレームをどのように決定しますか?更新:よりエレガントな方法?

- (void)scale:(UIPinchGestureRecognizer *)sender 
{ 
    if([sender state] == UIGestureRecognizerStateBegan) 
    { 
     lastScale = [sender scale]; 
    } 

    if ([sender state] == UIGestureRecognizerStateBegan || 
     [sender state] == UIGestureRecognizerStateChanged) 
    { 

     CGFloat currentScale = [[[sender view].layer valueForKeyPath:@"transform.scale"] floatValue]; 


     CGFloat newScale = 1 - (lastScale - [sender scale]) * (UIComicImageViewPinchSpeed); 
     newScale = MIN(newScale, minScale/currentScale); 
     newScale = MAX(newScale, maxScale/currentScale); 
     CGAffineTransform transform = CGAffineTransformScale([[sender view] transform], newScale, newScale); 
     [sender view].transform = transform; 

     lastScale = [sender scale]; 
    } 
} 

私は私が実際に変換を実行する前に、ImageViewのフレームの新しい中心がされる場所を決定する必要があります。とにかくこれを決めるには?基本的には、画像を画面の外に動かすか、それに近づけるとスケーリングを止めようとしています。形質転換されたフレームを把握するために、その方法を示唆するための以下ロビンへ

UPDATE

おかげ。私が今実行している問題は、変換が実行された後にフレームが無効になり、画像の境界を突き止めるために最新のフレームを追跡する必要があることです。明らかに、私はこれを手動で行うことができ、インスタンス変数に格納することができますが、これを達成するためのより "エレガントな"方法があるのだろうか?このような

答えて

2

使用CGRectApplyAffineTransform:あなたの助けを

CGRect currentFrame = ....; 

CGRect newFrame = CGRectApplyAffineTransform(currentFrame, transform); 

// Then test if newFrame is within the limits you want 
+1

感謝。私はこれを実装し、テストするために、currentFrameとnewFrameを印刷しました。最後のnewFrameは最新のcurrentFrameと一致する必要がありますが、そうではありません。彼らはいけませんか?それとも、何か間違っているのでしょうか? –

関連する問題