菜鸟教程小白 发表于 2022-12-12 18:14:01

ios - 通过缩放将 UIView 定位在 UIImageView 上


                                            <p><p>我问了一个类似的问题 <a href="https://stackoverflow.com/questions/34887582/position-an-uiimageview-over-another-with-scaling/34887933#34887933" rel="noreferrer noopener nofollow">here</a> ,并得到了我接受的答案。我的新问题需要将常规 <code>UIView</code> 放置在 ImageView 上,从而使其他解决方案无法使用。所以,新问题... </p>

<p><code>UIImageView</code> 上是否有方法告诉我其图像在其边界内的位置?假设我有一张汽车的图像,如下所示:</p>

<p> <a href="/image/ZZGYz.png" rel="noreferrer noopener nofollow"><img src="/image/ZZGYz.png" alt="car with missing wheel"/></a> </p>

<p>这张图片是 600x243,并且,后轮应该在的位置,有一个 118,144,74,74 (x,y,w,h) 的孔。</p>

<p>我想将汽车图像放置在一个 <code>UIImageView</code> 中,它的大小基于布局是任意的,我想以自然的纵横比查看整辆汽车。所以我将 ImageView 的内容模式设置为 <code>UIViewContentModeScaleAspectFit</code>,效果很好。</p>

<p>例如,这是 267x200 的 imageView 中的汽车:</p>

<p> <a href="/image/AjST9.png" rel="noreferrer noopener nofollow"><img src="/image/AjST9.png" alt="enter image description here"/></a> </p>

<p>我认为这样做会将图像从 w=600 缩放到 w=267,或者缩放 267/600=0.445,并且(我认为)这意味着高度从 200 变为 200*0.445=89 .而且我认为这个洞也确实被那个因素放大了</p>

<p>但我想在 ImageView 上方添加一个 <code>UIView</code>(作为同级),这就是我感到困惑的地方。我知道图像大小,我知道 imageView 大小,并且我知道原始图像大小方面的孔框。图片缩放后如何获取孔框?</p>

<p>我尝试过这样的事情:</p>

<ol>
<li><p>确定汽车图像在其<code>UIImageView</code> 中的位置。是这样的:</p>

<pre><code>float ratio=carImage.width/carImageView.frame.size.width;// 0.445
CGFloat yPos=(carImageView.frame.size.height-carImage.height)/2;// there should be a method for this?
</code></pre> </li>
<li><p>确定孔的缩放框架:</p>

<pre><code>CGFloat holeX = ratio*118;
CGFloat holeY = yPos + ratio*144;
CGFloat holeEdge = ratio*74;
CGRect holeRect = CGRectMake(holeX,holeY,holeEdge,holeEdge);
</code></pre> </li>
<li><p>将holeRect转换为父 View 的坐标系,为UIView兄弟创建框架。</p>

<pre><code>;
</code></pre> </li>
</ol>

<p>但必须有更好的方法。这些计算(如果它们是正确的)仅适用于比汽车<em>更高</em>的汽车 ImageView 。如果 ImageView 更宽,代码需要不同。</p>

<p>我想我可以为更广阔的视野找出逻辑,但它仍然可能是错误的。比如那个<code>yPos</code>计算。文档是否说,对于内容模式 = AspectFit,图像在较大尺寸内居中?我没看到那个地方。</p>

<p>请告诉我有更好的方法,或者,如果没有,是否证明我的想法适用于任意大小的图像、 ImageView 、孔?</p>

<p>谢谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>非常感谢 @originaluser2 帮助我解决这个问题。事实证明,AVFoundation 库中有一个可用的单行代码:</p>

<pre><code>// given an imageView and an image
CGRect imageRect = AVMakeRectWithAspectRatioInsideRect(image.size, imageView.bounds);
</code></pre>

<p><code>imageRect</code> 将作为图像在 imageView 坐标系中占据的矩形结束(因为我们通过了边界;通过框架将在父坐标系中解决)。</p>

<p>对于我的问题,我现在可以根据以下方式缩放孔矩形:</p>

<pre><code>CGFloat scaleX = image.size.width / imageView.bounds.size.width;
CGFloat scaleY = image.size.height / imageView.bounds.size.height;
</code></pre>

<p>既然我有了imageRect的原点,那么难的部分就完成了,直接加上吧:</p>

<pre><code>CGFloat scaledOriginX = holeX*scaleX + imageRect.origin.x;
CGFloat scaledOriginY = holeY*scaleY + imageRect.origin.y;
</code></pre>

<p>当然,还可以缩放洞的宽度和高度:</p>

<pre><code>CGFloat scaledWidth = holeWidth*scaleX;
CGFloat scaledHeight = holeHeight*scaleY;
</code></pre>

<p>这就是完整的、更正的矩形。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 通过缩放将 UIView 定位在 UIImageView 上,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/34893198/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/34893198/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 通过缩放将 UIView 定位在 UIImageView 上