菜鸟教程小白 发表于 2022-12-13 02:56:44

iphone - 将 CGAffineTransformRotation 关联到 CGAffineTransformTranslation


                                            <p><p>我正在尝试使用 CGAffineTransformRotate 旋转基于触摸手势添加到父 View 上的自定义 View(VIEWA)。一切正常。现在,我在父 View 上添加了另一个 View (VIEWB),它应该在旋转时遵循 VIEWA 的角所追踪的路径。</p>

<p>我所做的是从 VIEWA 转换矩阵计算 VIEWB 的新坐标并翻译 subview 。即</p>

<pre><code>VIEWA.transform = CGAffineTransformRotate(startTransform, -angleDifference+M_PI_2);
CGFloat cosa = VIEWA.transform.a;
CGFloat msinb = VIEWA.transform.b;
CGFloat sinc = VIEWA.transform.c;
CGFloat cosd = VIEWA.transform.d;

CGFloat newX = VIEWB.center.x * cosa + VIEWB.center.y * msinb;
CGFloat newY = VIEWB.center.x * sinc + VIEWB.center.y * cosd;

CGFloat xdiff = newX - VIEWB.center.x;
CGFloat ydiff = newY - VIEWB.center.y;

VIEWB.transform = CGAffineTransformTranslate(VIEWB.transform, xdiff, ydiff);
</code></pre>

<p>但我无法得到我想要的。有人可以帮我吗?</p>

<p><strong>更新:</strong></p>

<p>这就是我想要做的:(红点是<strong>A</strong>,黑色弹出是<strong>B</strong>):</p>

<p> <img src="/image/iABza.png" alt="enter image description here"/> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我假设您旋转 ViewA,但红色圆圈停留在 ViewA 坐标系中的固定位置。因此,在 ViewA 的坐标系中,红色圆圈的中心应该很容易计算,如下所示:</p>

<pre><code>CGPoint redCircleCenterInViewA = CGPointMake(CGRectGetMidX(viewA.bounds), 12);
</code></pre>

<p>您可以简单地将该点转换为父 View 的坐标系,如下所示:</p>

<pre><code>CGPoint redCircleCenterInParentView = [viewA convertPoint:redCircleCenterInViewA
    toView:viewA.superview];
</code></pre>

<p>然后您可以将 ViewB 的中心设置为该点,减去 ViewB 高度的一半:</p>

<pre><code>viewB.center = CGPointMake(redCircleCenterInParentView.x,
    redCircleCenterInParentView.y - viewB.frame.size.height / 2);
</code></pre>

<h3>更新</h3>

<p>我看到您实际上有 <strong>layer</strong> A,而不是 <strong>view</strong> A。这只需要稍作修改。您发送到图层以转换坐标的消息与您发送到 View 的消息略有不同。</p>

<pre><code>CALayer *layerA = ...;
UIView *parentView = ...;
UIView *viewB = ...;

CGPoint redCircleCenterInLayerA = CGPointMake(CGRectGetMidX(layerA.bounds), 12);

CGPoint redCircleCenterInParentView = [layerA convertPoint:redCircleCenterInLayerA
    toLayer:parentView.layer];

viewB.center = CGPointMake(redCircleCenterInParentView.x,
    redCircleCenterInParentView.y - viewB.frame.size.height / 2);
</code></pre>

<p>请注意,还有 <code>convertPoint:fromLayer:</code> 和 <code>convertPoint:fromView:</code> 消息。不要让 Xcode 自动补全错误,否则你会摸不着头脑!</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - 将 CGAffineTransformRotation 关联到 CGAffineTransformTranslation,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/17379959/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/17379959/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - 将 CGAffineTransformRotation 关联到 CGAffineTransformTranslation