Hi! I have a weird problem with a LazyVGrid. I actually incurred it in an app I'm developing, but I managed to isolate it to a single view in a test project.
What I have is a list containing a LazyVGrid full of SF Symbols that the user can select. I wanted adaptive columns as I did not much care for the disposition, as long as the icons were nicely spaced between.
import SwiftUI
enum Symbol: String, CaseIterable, Codable {
case sunMax = "sun.max"
case sunHorizon = "sun.horizon"
case moon = "moon"
case sparkles = "sparkles"
case cloud = "cloud"
case cloudBolt = "cloud.bolt"
case bolt = "bolt"
case flame = "flame"
case drop = "drop"
case snowflake = "snowflake"
case rainbow = "rainbow"
case mountain2 = "mountain.2"
case leaf = "leaf"
case tree = "tree"
case dog = "dog"
case cat = "cat"
case bird = "bird"
case ladybug = "ladybug"
case fish = "fish"
case atom = "atom"
case mappin = "mappin"
case map = "map"
}
struct ContentView: View {
let columns = [GridItem(.adaptive(minimum: 43))]
@State private var selectedSymbol = Symbol.sunMax
var body: some View {
List {
LazyVGrid(columns: columns) {
ForEach(Symbol.allCases, id: \.self) { symbol in
Button {
selectedSymbol = symbol
} label: {
Image(systemName: symbol.rawValue)
.font(.title)
.padding(10)
.foregroundStyle(selectedSymbol == symbol ? .white : .primary)
.background {
if selectedSymbol == symbol {
Circle()
.foregroundStyle(
LinearGradient(colors: [.mint, .blue], startPoint: .topLeading, endPoint: .bottomTrailing)
)
}
}
}
}
}
.buttonStyle(.plain)
}
}
}
So, the problem: the code works fine most of the times. Actually, it always works on the iPhone 15 Pro (simulator). The problem happens on the iPhone 15 Pro Max (simulator), where, apparently, for some specific column widths, the app crashes.
Specifically, for any value from 37 through 43 that I pass to let columns = [GridItem(.adaptive(minimum: 43))]
the app crashes (on the Pro Max alone). Any other value the grid works fine.
Also, the crash happens only when 22 or more symbols are displayed. 21 symbols? Works fine.
The error I get is related to the underlying UIKit implementation, so I'm not quite sure how to debug it. Every information I gathered I did empirically, so I'm sure that the cause of the error is more general.
The error recites: "Collection view <UpdateCoalescingCollectionView 0x600000c9a3a0> is stuck in its update loop. This can happen when self-sizing views do not return consistent sizes, or the collection views frame/bounds/contentOffset is being constantly adjusted."
From what I can tell from the subsequent specific error messages, there's a "preferredSize" attribute constantly changing.
I honestly don't quite understand where the mistake might be, for the moment I solved using a minimum column width of 45, but the error is very strange to me.