TGViewer
ErrorNil. iOS-разработка ErrorNil. iOS-разработка @error_nil · 688 subscribers
Post #730 434
И код для кастомного Layout из видео


struct FlowLayout: Layout {
var spacing: CGFloat = 12

func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize {
let maxWidth = proposal.width ?? .infinity
var rowWidth: CGFloat = 0
var rowHeight: CGFloat = 0
var totalHeight: CGFloat = 0

for subview in subviews {
let size = subview.sizeThatFits(.unspecified)
if rowWidth + size.width > maxWidth, rowWidth > 0 {
totalHeight += rowHeight + spacing
rowWidth = size.width + spacing
rowHeight = size.height
} else {
rowWidth += size.width + spacing
rowHeight = max(rowHeight, size.height)
}
}
totalHeight += rowHeight
return CGSize(width: maxWidth, height: totalHeight)
}

func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) {
var x = bounds.minX
var y = bounds.minY
var rowHeight: CGFloat = 0

for subview in subviews {
let size = subview.sizeThatFits(.unspecified)
if x + size.width > bounds.maxX, x > bounds.minX {
x = bounds.minX
y += rowHeight + spacing
rowHeight = 0
}
subview.place(at: CGPoint(x: x, y: y),
anchor: .topLeading,
proposal: ProposedViewSize(size))
x += size.width + spacing
rowHeight = max(rowHeight, size.height)
}
}
}
  • ❤ 7
More from @error_nil
  1. Oct 9, 2026video post
  2. Oct 9, 2026К слову о том, что происходит
  3. Oct 9, 2026🫠
  4. Oct 7, 2026В общем, никто не просил, но я сделал — добавил мессенджер в своё приложение «Живой?». Ран…
  5. Oct 6, 2026Apple серьезно так поднапряглась с выходом нового айфона
  6. Oct 1, 2026А почему бы и нет? Я тут подумал, что такой формат решает проблему (не то что бы это прям…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →