iOSのある点を中心にスケールまたは回転するAnchorPointの設定


テキストリンク:http://blog.csdn.net/yongyinmg/article/details/37927833
ジェスチャーのスケールや回転操作、特定のポイントを中心に動作の変化、または2つの指の中心点、またはポイントを中心にする必要があることがよくあります.
この問題はまずiOSの各viewの階層関係を明確に知らなければならない.特に、現在のviewのframeとsuperViewのboundsは座標系であることをクリアします.
具体的には、AnchorPointはiOSです CoreAnimation層のもの.レイヤーのanchorPoint属性はCGPoint値で、レイヤーboundsに基づく位置座標系に合致する位置を指定します.Anchor pointはpositionに対するboundsの値を指定し、さらに重要なのは変換の支点である.AnchorPoint値の範囲は0-1であり、AnchorPointが支点位置の座標がboundsに占める割合を表していると理解できる.
iOS CoreAnimation座標系の原点は左上隅にあるので、レイヤーの支点がレイヤーの左上隅にある場合、そのAnchorPointは(0,0)であるべきであることを簡単に知ることができます.対応する支点が左下にある場合、AnchorPointは(0,1)であるべきである.既定の中心点のAnchorPointは(0.5,0.5)です.下図の方がわかりやすいです.
 
一、AnchorPointの設定方法
実際、1つのレイヤーのAnchorPointを変更すると、このレイヤーはシフトを送信します.理由は表ではなく、文書を見ればわかります.問題は変位が発生した後、私たちはどのように変位を修復するかです.次は書き方です.
- (void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view
{
    CGPoint oldOrigin = view.frame.origin;
    view.layer.anchorPoint = anchorPoint;
    CGPoint newOrigin = view.frame.origin;

    CGPoint transition;
    transition.x = newOrigin.x - oldOrigin.x;
    transition.y = newOrigin.y - oldOrigin.y;

    view.center = CGPointMake (view.center.x - transition.x, view.center.y - transition.y);
}

もちろん、彼をUIViewのcategaryに書くこともできます.呼び出しが便利になります.
AnchorPoint周辺の変換が完了したら、必ずAnchorPointをデフォルトに戻すことを忘れないでください.特殊なAnchorPointを必要としない操作もあります.例えば、ドラッグすると、めちゃくちゃになります.
- (void)setDefaultAnchorPoint forView:(UIView *)view
{
    [self setAnchorPoint:CGPointMake(0.5f, 0.5f) forView:view];
}

OK、以上は私たちがAnchorPointを知った後、どのようにAnchorPointの設定と回帰を行いますか.では、私たちが本当に望んでいるAnchorPointの値はどうやって手に入れますか?
二、どのようにAnchorPointを獲得しますか?
2つの指のズームまたは回転の場合は、次の方法を参照してください.
/**
 *  Correct  UIGestureRecognizer 's view 's anchor point , make the view scale or rotate correctly.
 */
- (void)correctAnchorPointBaseOnGestureRecognizer:(UIGestureRecognizer *)gr
{
    CGPoint onoPoint = [gr locationOfTouch:0 inView:gr.view];
    CGPoint twoPoint = [gr locationOfTouch:1 inView:gr.view];

    CGPoint anchorPoint;
    anchorPoint.x = (onoPoint.x + twoPoint.x) / 2 / gr.view.bounds.size.width;
    anchorPoint.y = (onoPoint.y + twoPoint.y) / 2 / gr.view.bounds.size.height;

    [self setAnchorPoint:anchorPoint forView:gr.view];
}

UIGestureRecongizerでstate== UIGestureRecognizerStateBeganの場合、呼び出されます.そしてジェスチャーが終了したり失敗したりしたとき、(Gr.state==UIGestureRecognizerStateEnded) Gr.state == UIGestureRecognizerStateFailed || pinchGr.state==U IGestureRecognizerStateCancelled)は、Anchor Pointをデフォルトに戻します.
例えば、私が必要としている場合は、90度回転が必要な場合は、ビューの中心ではなくキャンバスの中心を中心に回転します.以下の方法の参考になります.
- (void)correctAnchorPointForView:(UIView *)view
{
    CGPoint anchorPoint = CGPointZero;
    CGPoint superviewCenter = view.superview.center;
//   superviewCenter view superview   center  view.superview.superview    。
    CGPoint viewPoint = [view convertPoint:superviewCenter fromView:view.superview.superview];
//       ,  superviewCenter   view    
    anchorPoint.x = (viewPoint.x) / view.bounds.size.width;
    anchorPoint.y = (viewPoint.y) / view.bounds.size.height;

    [self setAnchorPoint:anchorPoint forView:view];
}

変換後、リセット AnchorPointをデフォルトにします.