13

私は、CGAffineScale を使用してビューを特定のポイントに変換する方法を見つけるために多くの時間を費やしました。これには、アンカー ポイントをいじったり、変換の前後にビューの中心を移動したり、包括的なグーグルが含まれます。UIScrollview を使用すると、これがはるかに簡単になることは承知しています。しかし、技術的にはなくても可能であることはわかっています。

この答えは私が達成したいものに非常に近いですが、答えは、ズームインしたいコーナーの反対側のコーナーに中心を巧みに移動することにより、(特定のポイントではなく) 特定のコーナーにズームする方法の詳細のみを提供します.

UIView の任意のポイントに UIView をスケーリングするためにmvdsのコードを変更するにはどうすればよいですか?

CGFloat s = 3;
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;
    self.view.center = CGPointMake(w-w*s/2,h*s/2);
} completion:^(BOOL finished) {}];
4

2 に答える 2

6

関連する 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) {}];
于 2013-08-23T07:47:50.823 に答える
4

私は実際にこれとまったく同じ問題に遭遇しました。それを修正するために、スケーリングしていたビューのアンカー ポイントを変更するだけでした。これは、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) {}];
于 2013-09-18T04:10:06.963 に答える