2

我有一个图像视图,它以某种方式受到约束,使其左、右和上边缘固定到它的超级视图,并且它的下边缘与下面的标签有固定的间距。它没有任何宽度或高度限制,因此它应该从其图像的固有尺寸中获取其高度。内容模式设置为Aspect Fit

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

图像按预期按比例缩小,使其宽度与图像视图的宽度相匹配。但是图像视图并没有相应地更新它的高度,在上面和下面留下空白。我知道图像视图仍然从图像的原始高度获得它的高度。但是由于内容模式,图像的高度现在要小得多,我希望图像视图调整其高度以匹配图像的实际高度。

我正在寻找一种适用于这三种情况的巧妙解决方案,最好是一种适用于IB_DESIGNABLE视图的解决方案。有任何想法吗?

情况1

内在宽度 < 框架宽度

内在宽度 < 框架宽度

案例二

内在宽度 = 框架宽度

内在宽度 = 框架宽度

案例3

内在宽度 > 框架宽度

内在宽度 > 框架宽度

4

1 回答 1

1

UIImageView您可以通过以下方式创建扩展:

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: "%K == %d && %K == %f", "firstAttribute", NSLayoutAttribute.Height.rawValue, "constant", 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
}
}

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

在此处输入图像描述

在设置此属性时,高度约束将添加到您的imageView. 在我的解决方案中,计算adjustedHeight可能不是很整洁,因此您可以进一步研究。

于 2016-02-10T14:00:31.030 回答