Вы можете использовать UIImageGraphicsRenderer
и draw
изображения одно за другим:
func combineHorizontally(_ images: [UIImage]) -> UIImage? {
guard !images.isEmpty else { return nil }
var size = CGSize.zero
var scale = CGFloat.zero
for image in images {
scale = max(scale, image.scale)
size = CGSize(width: size.width + image.size.width, height: max(size.height, image.size.height))
}
var position = CGPoint.zero
let format = UIGraphicsImageRendererFormat()
format.scale = scale
return UIGraphicsImageRenderer(size: size, format: format).image { _ in
for image in images {
image.draw(at: position)
position.x += image.size.width
}
}
}
Вы сказали, что были только изображения, и они были 100 × 100, но приведенное выше должно работать независимо от число и размер (конечно, если позволяет память).
В любом случае, это
let image = combineHorizontally([redImage, greenImage, blueImage])
Результат:
введите описание изображения здесь
Чтобы использовать это в контексте, где вам не нужен необязательный параметр, вы можете использовать оператор принудительного развертывания !
, оператор объединения ??
nil или какой-либо другой шаблон развертывания, например guard let
, if let
, et c.
В качестве альтернативы, если вы вообще не хотите иметь дело с необязательными параметрами, вы можете написать представление, которое вообще не возвращает необязательный параметр (но также не обнаруживает сценарий ошибки где был предоставлен пустой массив):
func combineHorizontally(_ images: [UIImage]) -> UIImage {
var size = CGSize.zero
var scale: CGFloat = 1
for image in images {
scale = max(scale, image.scale)
size = CGSize(width: size.width + image.size.width, height: max(size.height, image.size.height))
}
var position = CGPoint.zero
let format = UIGraphicsImageRendererFormat()
format.scale = scale
return UIGraphicsImageRenderer(size: size, format: format).image { _ in
for image in images {
image.draw(at: position)
position.x += image.size.width
}
}
}