Swift 如何根据UIImaveView的图像调整其大小?
我想让Swift 如何根据UIImaveView的图像调整其大小?,swift,uiimageview,Swift,Uiimageview,我想让UIImageView尽可能多地填充容器,但容器内的图片应保持其纵横比,并且容器应适合其中图片的大小 下面是它现在无法工作时的情况: 我已经解决了这个问题,但只有在第一次加载视图时,当我更改imageView的图像时,它才会变得越来越小 我用这个扩展解决了这个问题: 因此,当获取UIImage时,我调用layout方法来布局我的UIViews,然后在UIImageView中设置图像。接下来,在父UIView的绘图方法中,我计算UIImageView的contentClippingRec
UIImageView
尽可能多地填充容器,但容器内的图片应保持其纵横比,并且容器应适合其中图片的大小
下面是它现在无法工作时的情况:
我已经解决了这个问题,但只有在第一次加载视图时,当我更改imageView的图像时,它才会变得越来越小
我用这个扩展解决了这个问题:
因此,当获取UIImage
时,我调用layout方法来布局我的UIViews,然后在UIImageView中设置图像。接下来,在父UIView的绘图方法中,我计算UIImageView
的contentClippingRect
,然后将UIImageView
的约束设置为contentClippingRect
并再次布局
当imageView中没有图像时,我的布局方法将UIImageView
的约束重置为整个容器的约束
但正如我所说的,当我改变图片时,它将不起作用,而且我在改变图片时会遇到约束问题
以下是我尝试过的:
var image: UIImage? {
didSet {
photoView.image = nil
layout()
photoView.image = image
}
}
override func draw(_ rect: CGRect) {
if photoView.image != nil {
setPictureFrame()
layout()
}
}
private func setPictureFrame() {
let photoRect = photoView.contentClippingRect
photoView.clearConstraints()
photoView.heightAnchor.constraint(equalToConstant: photoRect.height).isActive = true
photoView.widthAnchor.constraint(equalToConstant: photoRect.width).isActive = true
}
private func layout() {
var layoutConstraints: [NSLayoutConstraint] = []
if photoView.image == nil {
photoView.clearConstraints()
photoView.constraintsFillWhole(view: photoViewContainer)
}
layoutConstraints += [
photoView.centerXAnchor.constraint(equalTo: self.centerXAnchor),
photoView.centerYAnchor.constraint(equalTo: photoViewContainer.centerYAnchor),
]
NSLayoutConstraint.activate(layoutConstraints)
}
非常感谢你的帮助 您也可以从情节提要中创建适合自己的方面。转到该图像视图的属性检查器,您将从中找到内容模式。这里有一个例子 你也可以通过编程来完成 斯威夫特
yourImageView.contentMode = .scaleAspectFill // or you can use .scaleToFill
目标c
yourimageView.contentMode = UIViewContentModeScaleAspectFit;
以下是一些可编程使用的内容模式
UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit,
UIViewContentModeScaleAspectFill,
UIViewContentModeRedraw,
UIViewContentModeCenter,
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,
您还可以使方面与故事板相适应。转到该图像视图的属性检查器,您将从中找到内容模式。这里有一个例子 你也可以通过编程来完成 斯威夫特
yourImageView.contentMode = .scaleAspectFill // or you can use .scaleToFill
目标c
yourimageView.contentMode = UIViewContentModeScaleAspectFit;
以下是一些可编程使用的内容模式
UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit,
UIViewContentModeScaleAspectFill,
UIViewContentModeRedraw,
UIViewContentModeCenter,
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,
你能给出预期行为的例子吗?预期行为应该像在图像中,但是UIimageView的边框应该在图像上。你能给出预期行为的例子吗?预期行为应该像在图像中,但是UIimageView的边框应该在图像上是的,我知道,我使用这个,但是由于ImageView的边框,ImageView需要获取其图像的大小。是否设置其高度或宽度的约束?当调用setPictureName()并在layout中当image==nil时,uiview将获取我知道的容器的框架,我使用它,但ImageView需要获取其图像的大小,由于imageView的边框,您是否为其高度或宽度设置约束?当调用setPictureName()时,以及在布局中当image==nil时,uiview将获取容器的框架