菜鸟教程小白 发表于 2022-12-13 14:11:05

ios - 当图像由于内容模式而缩小时,使 ImageView 调整其高度以匹配其图像的高度


                                            <p><p>我有一个 ImageView ,它的左、右和上边缘被固定到它的 superView ,它的下边缘与下面的标签有一个固定的间距。它没有任何宽度或高度限制,因此它应该从其图像的固有尺寸中获取其高度。内容模式设置为<code>Aspect Fit</code>。</p>

<p>如果图像的宽度小于或等于 ImageView 的宽度(情况 1 和 2,请参见下图),则此方法非常有用。但是,如果图像的宽度超过其包含的 ImageView 的宽度,我会遇到问题(案例 3):</p>

<p>图像按预期缩小,使其宽度与 ImageView 的宽度相匹配。 <strong>但 ImageView 不会相应地更新其高度</strong>,会在上方和下方留下空白。我知道 ImageView 仍然从图像的 <em>original</em> 高度获得它的高度。但是由于内容模式,图像的高度现在要小很多,我希望 ImageView 调整其高度以匹配图像的<em>实际</em>高度。</p>

<p>我正在寻找一种适用于这三种情况的简洁解决方案,最好是一种适用于 <code>IB_DESIGNABLE</code>View 的解决方案。有什么想法吗?</p>

<h2>案例一</h2>

<p><strong>内在宽度<框架宽度</strong></p>

<p> <a href="/image/1szE7.png" rel="noreferrer noopener nofollow"><img src="/image/1szE7.png" alt="intrinsic width &lt; frame width"/></a> </p>

<h2>案例 2</h2>

<p><strong>内在宽度 = 框架宽度</strong></p>

<p> <a href="/image/jWHkC.png" rel="noreferrer noopener nofollow"><img src="/image/jWHkC.png" alt="intrinsic width = frame width"/></a> </p>

<h2>案例 3</h2>

<p><strong>内在宽度 > 框架宽度</strong></p>

<p> <a href="/image/QMHpo.png" rel="noreferrer noopener nofollow"><img src="/image/QMHpo.png" alt="intrinsic width &gt; frame width"/></a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可以通过以下方式在 <code>UIImageView</code> 上创建扩展:</p>

<pre><code>extension UIImageView {
    @IBInspectable var shouldAdjustHeight: Bool {
      get {
            return self.frame.size.height == self.adjustedHeight;
      }
      set {
            if newValue {
                if !shouldAdjustHeight {
                  let newHeight = self.adjustedHeight

                  // add constraint to adjust height
                  self.addConstraint(NSLayoutConstraint(
                        item:self, attribute:NSLayoutAttribute.Height,
                  relatedBy:NSLayoutRelation.Equal,
                  toItem:nil, attribute:NSLayoutAttribute.NotAnAttribute,
                  multiplier:0, constant:newHeight))
            }
      }
      else {
            let newHeight = self.adjustedHeight
            // create predicate to find the height constraint that we added
            let predicate = NSPredicate(format: &#34;%K == %d &amp;&amp; %K == %f&#34;, &#34;firstAttribute&#34;, NSLayoutAttribute.Height.rawValue, &#34;constant&#34;, newHeight)
            // remove constraint
            self.removeConstraints(self.constraints.filter{ predicate.evaluateWithObject($0) })
      }
    }
}

var adjustedHeight: CGFloat {
    let screenWidth = UIScreen.mainScreen().bounds.width
    let deviceScaleFactor = screenWidth/self.bounds.size.width
    return CGFloat(ceilf(Float(deviceScaleFactor * AVMakeRectWithAspectRatioInsideRect((self.image?.size)!, self.bounds).size.height))) // deviceScaleFactor multiplied with the image size for the frame
    // I am using size class in my XIB with value as (Any,Any) and I was not getting correct frame values for a particular device so I have used deviceScaleFactor.
    // You can modify above code to calculate newHeight as per your requirement
}
}
</code></pre>

<p>添加上述扩展后,您可以在Interface-builder中设置属性,如下所示。</p>

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

<p>在设置此属性时,高度约束将被添加到您的 <code>imageView</code>。 <strong><em><code>adjustedHeight</code> 的计算在我的解决方案中可能不是很整洁,所以您可以进一步研究。</em></strong></p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 当图像由于内容模式而缩小时,使 ImageView 调整其高度以匹配其图像的高度,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/35312935/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/35312935/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 当图像由于内容模式而缩小时,使 ImageView 调整其高度以匹配其图像的高度