如何在 UIImage 数组中设置第二张或中间的图像? (斯威夫特 3)
Posted
技术标签:
【中文标题】如何在 UIImage 数组中设置第二张或中间的图像? (斯威夫特 3)【英文标题】:How to set the second or middle images in a UIImage array? (Swift 3) 【发布时间】:2017-08-14 01:18:04 【问题描述】:我正在使用一个 imagePicker,它使我能够选择 4 个图像并创建一个选定的数组。我想用我选择的那 4 个图像设置 4 个空 UIImageView 的图像。使用图像数组:images.first,我可以将第一个空 UIImageView 设置为我选择的第一个图像。我还可以使用 images.last 设置另一个空的 UIImageView 来获取第四个选定的图像。
如何设置我选择的第二个和第三个图像的空UIImageViews的图像?
我正在使用“if let”检查数组的第一个和最后一个元素,但我不知道是否可以对第二个和第三个元素进行“if let”检查以防止我的应用程序如果我不选择四个图像,则会崩溃。
func doneButtonDidPress(_ imagePicker: ImagePickerController, images: [UIImage])
let images = imageAssets
if let imageOne = images.first
profileImageViewOne.image = imageOne
profileImageViewTwo.image = images[1]
profileImageViewThree.image = images[2]
if let imageFour = images.last
profileImageViewFour.image = imageFour
【问题讨论】:
一组图像是难闻的气味。图像是非常大的物体;持有它们的数组可能会因为内存不足而使您崩溃。 — 另外,您的问题非常不清楚。 我试图更清楚地说明我在问什么。我打算将每个图像存储在 Firebase 中,但如果我不选择四个图像,我的应用程序将会崩溃。我只能对数组的 .first 和 .last 元素使用“if let checks”。 你听说过count
吗?
【参考方案1】:
您不需要使用 if let 语句,因为如果您使用索引从图像数组中获取图像,在这种情况下它们始终是非可选的。
为避免任何崩溃,您可以检查所选图像的数量。像这样的:
func doneButtonDidPress(_ imagePicker: ImagePickerController, images: [UIImage])
switch images.count
case 1:
profileImageViewOne.image = images.first //you don't need to unwrap it, because imageView.image is an optional parameter
case 2:
profileImageViewOne.image = images.first
profileImageViewTwo.image = images[1]
case 3:
profileImageViewOne.image = images.first
profileImageViewTwo.image = images[1]
profileImageViewThree.image = images.last
case 4:
//same way
default: break
还有另一种填充图像视图的方法。您也可以将图像视图的引用添加到数组中(例如在 viewDidLoad() 中)。
喜欢这个
let views: [UIImageView] = [] //first we need to allocate an array
//then fill it inside viewDidLoad() or whatever
views = [profileImageViewOne, profileImageViewTwo, ...]
然后用它来设置图片:
func doneButtonDidPress(_ imagePicker: ImagePickerController, images: [UIImage])
//fill imageviews in order according to images count
for (index, image) in images.enumerated()
let imageView = views[index]
imageView.image = image
//if images count = 2, that method will fill only two imageviews with same indexes as images have. But it will not clear those views, that are out of range of images array
//so if you need to clear them if images.count < views.count, you can use this:
//put it before setting images to views, it will clear all imageviews
views.forEach($0.image == nil)
【讨论】:
感谢您的详尽解释,并向我展示了第二个选项。我不知道该怎么做。【参考方案2】:像这样:
let imageViews = [
profileImageViewOne, profileImageViewTwo,
profileImageViewThree, profileImageViewFour
]
for (iv,im) in zip(imageViews,images)
iv.image = im
这会将有多少图像(最多四个)分配给该数量的图像视图。
但是,您以一种非常愚蠢的方式进行了设置。如果您 开始 使用图像视图数组(使用 outlet 集合),我的代码的第一行将是不必要的。
【讨论】:
谢谢,我也试试 for 循环。我正在以编程方式做所有事情。你的帮助很大。我正在大量调整我的代码。以上是关于如何在 UIImage 数组中设置第二张或中间的图像? (斯威夫特 3)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Access 2007 中设置第一个连续组合框不可见?