Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Interface Builder:使用“时自动设置UIImageView的纵横比”;Aspect Fit;?_Ios_Uiimageview_Autolayout_Storyboard_Interface Builder - Fatal编程技术网

Ios Interface Builder:使用“时自动设置UIImageView的纵横比”;Aspect Fit;?

Ios Interface Builder:使用“时自动设置UIImageView的纵横比”;Aspect Fit;?,ios,uiimageview,autolayout,storyboard,interface-builder,Ios,Uiimageview,Autolayout,Storyboard,Interface Builder,下面的共享图标(图像为白色)为114x128像素 但是,使用AutoLayout将Interface Builder中的高度固定为23像素,然后使用内容模式的Aspect Fit不会更改框架矩形 这会导致对齐问题,因为如果希望图标距离后缘15像素,现在很难做到这一点 一个选项是手动设置纵横比(即114/128)作为IB内的自动布局约束 但这是非常脆弱的。如果更改图像尺寸,必须记住调整纵横比 有没有一种IB自动调整框架矩形和内容的方法 最后一种选择是在代码中完成所有操作,但在IB中完成所有操作都是

下面的共享图标(图像为白色)为114x128像素

但是,使用AutoLayout将Interface Builder中的高度固定为23像素,然后使用内容模式Aspect Fit不会更改框架矩形

这会导致对齐问题,因为如果希望图标距离后缘15像素,现在很难做到这一点

一个选项是手动设置纵横比(即114/128)作为IB内的自动布局约束

但这是非常脆弱的。如果更改图像尺寸,必须记住调整纵横比

有没有一种IB自动调整框架矩形和内容的方法

最后一种选择是在代码中完成所有操作,但在IB中完成所有操作都是理想的

帧矩形在IB中不改变:

共享图标(白色图标,此处不可见):


我相信您必须以编程方式完成此操作。如果您不想逐个视图进行操作,只需定义一些子类(可以在IB中指定为基类),以编程方式设置约束

class RatioImageView: UIImageView {

    private var ratioConstraint: NSLayoutConstraint?

    override var image: UIImage? {
        didSet { updateRatioConstraint() }
    }

    override func didMoveToSuperview() {
        super.didMoveToSuperview()

        updateRatioConstraint()
    }

    private func updateRatioConstraint() {
        if let ratioConstraint = ratioConstraint {
            removeConstraint(ratioConstraint)
        }

        guard superview != nil else { return }

        let ratio: CGFloat
        if let image = image {
            ratio = image.size.width / image.size.height
        } else {
            ratio = 1
        }

        ratioConstraint = widthAnchor.constraint(equalTo: heightAnchor, multiplier: ratio)
        ratioConstraint?.isActive = true
    }
}
这可以在图像视图上实现,但您也可以使用
ui按钮
或其他类似的功能


或者在主题的另一个变体中,您可以使用内部大小来控制这一点,您可以显式地设置
高度
(因为这是
@IBInspectable
,所以您可以在IB中正确地执行此操作),并且它将返回该高度的内部大小:

@IBDesignable
class RatioImageView: UIImageView {

    @IBInspectable var height: CGFloat = 0

    override var intrinsicContentSize: CGSize {
        guard let image = image else { return .zero }
        guard height > 0 else { return image.size }

        let ratio = image.size.width / image.size.height

        return CGSize(width: height * ratio, height: height)
    }

}

.contentMode不会更改帧。只有图像在帧内的显示方式。我认为实现您想要的东西的唯一方法是使用代码。@演示如果您是对的,这是令人沮丧的。框架会随着内容的变化而变化,否则会遇到上述对齐问题,这就更有意义了。啊,苹果!好吧,用代码做起来非常简单。就像一行。为什么不呢?@Demosthese因为还有很多图标:)非常感谢!令人沮丧的是,IB并没有自动完成这项工作。为什么要调整内容而不是框架???也许有一些原因,但一点也不清楚。