这个问题似乎在过去几年中出现了很多,但没有具体的答案。基本上是:
我有一个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引起的空白?
答案 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