Swift - ScaleAspectFit空格,imageView.image nul

时间:2016-10-12 18:31:00

标签: ios swift uiimageview

这个问题似乎在过去几年中出现了很多,但没有具体的答案。基本上是:

我有一个UIImageView,其中图像是使用给定的URL设置的。然后,我将内容模式设置为Scale Aspect Fit。这样可以正常工作,但是当图像应该直接位于屏幕顶部时,图像前后有大量的空白区域。

我想要做的是重新缩放UIImage大小(可能是帧?)以匹配应用Aspect Fit时创建的新大小(似乎是大多数人收到的建议)。

问题是,每当我测试以前的解决方案时,我都会遇到错误。特别是:

import UIKit
import AVFoundation

class OneItemViewController: UIViewController {

    @IBOutlet weak var itemImage: UIImageView!
    @IBOutlet weak var menuButton: UIBarButtonItem!
    @IBOutlet weak var titleText: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let imageURL:NSURL? = NSURL(string: "https://upload.wikimedia.org/wikipedia/commons/d/d5/Pic_de_neige_cordier_Face_E.jpg")

        if imageURL != nil {
            itemImage.sd_setImageWithURL(imageURL)

            itemImage.contentMode = UIViewContentMode.ScaleAspectFit

            AVMakeRectWithAspectRatioInsideRect(itemImage.image!.size, itemImage.bounds)

            /**
             let imageSize:CGSize = onScreenPointSizeOfImageInImageView(itemImage)
             var imageViewRect:CGRect = itemImage.frame
             imageViewRect.size = imageSize
             itemImage.frame = imageViewRect
             **/
        }

        if self.revealViewController() != nil {
            menuButton.target = self.revealViewController()
            menuButton.action = "revealToggle:"
            self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
        }

        self.titleText.text = "Title: " + "Earl and Countess of Derby with Edward, their Infant Son, and Chaplain"

        // Do any additional setup after loading the view.
    }


    /**


    func onScreenPointSizeOfImageInImageView(imageV: UIImageView) -> CGSize {

        var scale: CGFloat

        if (imageV.frame.size.width > imageV.frame.size.height) {
            if (imageV.image!.size.width > imageV.image!.size.height) {
                scale = imageV.image!.size.height / imageV.frame.size.height
            } else {
                scale = imageV.image!.size.width / imageV.frame.size.width
            }
        } else {
            if (imageV.image!.size.width > imageV.image!.size.height) {
                scale = imageV.image!.size.width / imageV.frame.size.width
            } else {
                scale = imageV.image!.size.height / imageV.frame.size.height
            }
        }

        return CGSizeMake(imageV.image!.size.width / scale, imageV.image!.size.height / scale)
    }

    **/
}

在这里尝试了两件事来摆脱空白。

首次尝试是对AVMakeRectWithAspectRatioInsideRect的调用。

第二次尝试是/ ** ** / comments中的两个代码块。 (onScreenPointSizeOfImageInImageView函数并在viewDidLoad中调用它。)

但我不知道是否有人工作,因为itemImage.image!.size导致错误。

所以有两个问题:

1)为什么itemImage.image!.size在打开时给我一个零?

2)有没有人找到更快的解决方案来删除AspectFit引起的空白?

2 个答案:

答案 0 :(得分:0)

imageView.widthAnchor.constraint(equalTo: imageView.heightAnchor, multiplier: image.size.width / image.size.height).isActive = true

答案 1 :(得分:0)

这个答案可以通过带有Swift 5的UIKit以编程方式回答

如@Ignelio所述,使用NSLayoutConstraint可以完成UIImageView的工作。

原因是您想保持纵横比-通过使用

// let UIImage be whatever you decide to name it
UIImage.contentMode = .scaleAspectFit

将使UIImageView中的UIImage适应给定宽度的比例大小。但是,如Apple文档中所述,这将使其余区域具有透明的间距。因此,您要解决的是UIImageView的大小/框架。

- 使用此方法,您可以为UIImageView赋予其宽度约束,该宽度约束等于UIImage的比率-相对于其父项的宽度约束(无论大小如何)可以完美地缩小。

// let UIImageView be whatever you name
UIImageView.widthAnchor.constraint(equalTo: UIImageView.heightAnchor, multiplier: UIImage.size.width / UIImage.size.height).isActive = true