2013-08-20 14 views
11

CGAffineScaleを使用してビューを特定のポイントに変換する方法を見つけようと多くの時間を費やしました。変換前後の視点と総合的なグーグルリング。私はこれがUIScrollviewを使ってもっと簡単になることを知っています。私はそれが技術的に可能であることを知っています、そしてそれは私の頭の中で砕けたものになっています。UIViewを指定されたCGPointに拡大(ズーム)する方法

This answerは私が達成したいものに非常に近いものになりますが、答えは、指定されたコーナーを(指定されたポイントではなく)ズームする方法を詳細に説明します。にズームインする。

mvds' codeを変更して、UIViewの任意のポイントにUIViewを拡大するにはどうすればよいですか?

答えて

4

2つのステップがあります。まず、ズームインするビューを拡大します。次に、見たい部分がビューの中央になるように、この吹き上がったビューの中心を設定します。

あなたは紙の上で、これを引き出す必要があり、式が続く:(未テスト)

CGFloat s = 3; 
CGPoint p = CGPointMake(100, 200); 
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s); 
CGFloat h = self.view.frame.size.height; 
CGFloat w = self.view.frame.size.width; 
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{ 
    self.view.transform = tr; 
    CGFloat cx = w/2-s*(p.x-w/2); 
    CGFloat cy = h/2-s*(p.y-h/2); 
    self.view.center = CGPointMake(cx, cy); //was: (w*s/2,h-h*s/2); 
} completion:^(BOOL finished) {}]; 
+2

ご回答ありがとうございます。私はこれを試しましたが、それでも間違った点にズームします。私も紙でこれを描こうとしましたが、論理は私を逃しています。 – glenstorey

2

が、私は実際にこの非常に同じ問題に自分自身を実行しました。これを修正するには、CGAffineTransformsがそのアンカーポイントに関連してビュー上で実行されるため、アンカーポイントがどこにあるかに応じて、変換が拡大、平行移動、または回転するため、私がスケーリングしていたビューのアンカーポイントを変更するだけでしたビューは異なっている。

CGPoint pointToScaleTo = CGPointMake(x, y); //Just enter the coordinates you 
              //want to scale your view towards 

CGFloat viewWidth = self.view.bounds.size.width; 
CGFloat viewHeight = self.view.bounds.size.height; 

CGFloat scaleFactorX = ...; 
CGFloat scaleFactorY = ...; 

CGAffineTransform scaleTransform = CGAffineTransformMakeScale(scaleFactorX, scaleFactorY); 

[UIView animateWithDuration:2.5f delay:0.0f options:0 animations:^{ 

    //I divide the x and y coordinates by the view width and height 
    //because the anchor point coordinates are normalized to the range 
    //0.0-1.0. 
    self.view.layer.anchorPoint = CGPointMake(pointToScaleTo.x/viewWidth, pointToScaleTo.y/viewHeight); 

    //Now that the anchor point has been changed, apply the scale transform 
    self.view.layer.transform = scaleTransform; 

} completion:^(BOOL finished) {}]; 
+1

あなたの答えをありがとう。 iOS7(私は思う)のために、私はCGAffineTransformラインを 'CATransform3D scaleTransform3D = CATransform3DMakeScale(scaleFactorX、scaleFactorY、1.0);'(view.layer.transformはCATransform3Dでなければならなかった)に変更しました。ここで起こるのは、pointToScaleToが中心にあるようにビューをジャンプさせることです(これは理想的ではありません - 理想的にはジャンプするのではなく、ズームインしたい点が理想です)。私はどこからローテーションを得ているのか分かりません。ジャンプしてからズームするのではなく、ポイントまでズームする方法を知っていますか? – glenstorey

+0

アフィン変換を 'self.view.layer.transform = CATransform3DMakeAffineTransform(scaleTransform);'を使って 'CATransform3D'に変換することができます。 – Dennis

関連する問題