2

左、右、上端がスーパービューに固定され、下端が下のラベルに固定された間隔になるように制約された画像ビューがあります。幅や高さの制約がないため、画像の固有のサイズから高さを取得することになっています。コンテンツモードが に設定されていAspect Fitます。

これは、画像の幅が画像ビューよりも小さいか等しい場合にうまく機能します (ケース 1 と 2、下の画像を参照)。ただし、画像の幅が含まれている画像ビューの幅を超える場合、問題が発生します (ケース 3):

画像は期待どおりに縮小され、その幅は画像ビューの幅と一致します。しかし、画像ビューはそれに応じて高さを更新せず、上下に空白が残ります。画像ビューは、画像のの高さから高さを取得していることを理解しています。しかし、コンテンツモードにより、画像の高さがはるかに小さくなり、画像の実際の高さに合わせて画像ビューの高さを調整したいと考えています。

私は、3つのケースのそれぞれで機能するきちんとしたソリューション、できればIB_DESIGNABLEビューでも機能するソリューションを探しています。何か案は?

ケース1

固有幅 < フレーム幅

固有幅 < フレーム幅

ケース 2

固有幅 = フレーム幅

固有幅 = フレーム幅

ケース 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 に答える