Мне нужно динамически размещать изображения в виде сетки / раствора, сохраняя их исходное соотношение сторон.По сути, я пытаюсь найти решение, похожее на решение Adobe Lightroom.
Первоначально я пытался добиться этого, фиксируя высоту, динамически изменяяширина ячейки на основе оставшегося пространства строки и масштаба изображения.Однако, поскольку я использую scaleAspectFit
, изображение масштабируется, а это означает, что иногда некоторые изображения обрезаются.
Я предполагаю, что мне также придется динамически играть с высотой, но я не понимаю, как.
Код, который я использую для процесса нормализации:
var i = 0
while i < sizes.count {
var maxWidth = collectionViewWidth // the width of the UICollectionView
var rowWidth: CGFloat = 0.0
var j = i
while rowWidth < maxWidth, j < sizes.count {
let belowThreshold = sizes[j].width < (maxWidth - rowWidth) * 1.30
let remainsEnough = (maxWidth - rowWidth) / maxWidth > 0.3 && belowThreshold
if belowThreshold || remainsEnough {
rowWidth += sizes[j].width
j += 1
} else { break }
}
let spacing = CGFloat((j - i - 1) * 2)
maxWidth -= spacing
var newRowWidth: CGFloat = 0
for l in i..<j {
let x = (sizes[l].width * maxWidth) / rowWidth
sizes[l].width = x.rounded(to: 3)
newRowWidth += sizes[l].width
}
if newRowWidth >= maxWidth {
let width = sizes[j-1].width - (newRowWidth - maxWidth).rounded(to: 3)
sizes[j-1].width = width.rounded(to: 3)
}
i = j
}
ОБНОВЛЕНИЕ 1
Вот URL-адрес GitHub для примера проектас тем, что у меня сейчас есть: https://github.com/abrahamduran/ios-mortar-view