Swift以编程方式创建uiimageview屏幕全宽保持高度比

Swift以编程方式创建uiimageview屏幕全宽保持高度比,swift,uiimageview,Swift,Uiimageview,我使用以下代码以编程方式创建uiimageview var imageView : UIImageView imageView = UIImageView(frame:CGRectMake(10, 50, 100, 300)); imageView.image = UIImage(named:"image.jpg") self.view.addSubview(imageView) 我遇到的问题是我希望uiimageview是屏幕的全宽,高度可以调整到当前的图像高度。我正在将不同大小的图像加载

我使用以下代码以编程方式创建uiimageview

var imageView : UIImageView
imageView  = UIImageView(frame:CGRectMake(10, 50, 100, 300));
imageView.image = UIImage(named:"image.jpg")
self.view.addSubview(imageView)
我遇到的问题是我希望uiimageview是屏幕的全宽,高度可以调整到当前的图像高度。我正在将不同大小的图像加载到此uiimageview中


如何做到这一点?

您必须将contentMode设置为.scaleSpectFit

let imageView = UIImageView(frame: self.view.frame) 
imageView.image = UIImage(named:"image.jpg") 
imageView.contentMode = .scaleAspectFit 
self.view.addSubview(imageView)

没有内置的方法可以让
UIImageView
根据
图像调整自身大小。更新图像时,必须通过更改帧的高度或设置新的纵横比约束来调整imageView的高度

UIImageView
上有一个
contentMode
设置(
.scaleSpectFit
),可以在imageView中保持图像的纵横比,但不会调整imageView本身的大小,但只需将图像放在其中,根据需要在图像上方和下方或侧面添加填充,以保持纵横比

更新帧:

以下是
ui图像视图
的扩展,当设置
图像
时,该扩展可更改
的高度:

extension UIImageView {
    func setImageAndUpdateFrameHeight(image: UIImage) {
        self.image = image

        if image.size.width > 0 {
            self.frame.size.height = self.frame.size.width / image.size.width * image.size.height
        }
    }
}

使用自动布局时更新纵横比

如果使用自动布局,则需要在更新图像时设置新的aspectRatio约束。使用
UIImageView
的此子类为您的
UIImageView
维护
aspectRatio
约束。您需要添加约束来放置图像并设置其宽度

class ResizingImageView: UIImageView {
    var aspectRatio: NSLayoutConstraint?

    func setImageAndUpdateAspectRatio(image: UIImage) {
        self.image = image

        aspectRatio?.isActive = false
        if image.size.width > 0 {
            aspectRatio = self.heightAnchor.constraint(equalTo: self.widthAnchor, multiplier: image.size.height / image.size.width)
        }
        aspectRatio?.isActive = true
    }
}
注意事项:

  • 如果在情节提要中进行设置,请拖出一个
    UIImageView
    ,并在Identity Inspector中将其类更改为
    ResizingImageView
  • 设置约束以放置imageView并确定其宽度(例如:将前导约束和尾随约束设置为其superview)
  • 给它一个高度约束,然后在尺寸检查器中将该约束的优先级更改为
    Low(250)
    ,以便apectRatio约束可以控制imageView的高度
  • @IBOutlet
    添加到您的imageView:
    @IBOutlet var imageView:ResizingImageView
  • 当需要添加图像时:
    imageView.setImageAndUpdateAspectRatio(图像:newImage)

  • 你可以用几种方法来解决这个问题。我想填充图像的两侧,使其位于中间

        view.addSubview(imageView)
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        imageView.widthAnchor.constraint(equalToConstant: view.frame.width - 80).isActive = true
        imageView.heightAnchor.constraint(equalToConstant: view.frame.width - 80).isActive = true
    

    这不会更改图像视图的高度。这会改变图像在图像视图中的显示方式。这有帮助吗?你有什么问题吗?