SwiftUI使用SF Symbols实现动画时提示找不到系统符号问题
问题原因分析
- 符号不存在报错的根源:当
index为0时,getSize()返回值为0,你通过.font(.system(size: 0))加载SF Symbols时,系统无法处理字号为0的渲染逻辑,误判为要加载不存在的符号,抛出错误和紫色运行时警告。而Circle()作为SwiftUI内置的Shape类型,frame为0时仅会静默不渲染,不会触发异常。 - 动画不生效的根源:SwiftUI默认对Shape的
frame属性支持动画插值,你修改绑定的数值时可以平滑过渡。但font的字号不属于默认可动画属性,修改时不会生成中间过渡帧,只会出现跳变效果。
修复方案
你可以调整ExpandingCircleImage的实现,不用字号控制符号大小,转为用resizable()+frame控制大小,同时处理边界值即可正常运行,代码参考如下:
struct ExpandingCircleImage: View { let index: Int private func getSize() -> CGFloat { // 处理边界值,避免size为0 return CGFloat(max(index * 2, 1)) } private func getOpacity() -> CGFloat { if index == 0 || index == 40 { return 0 } else { return CGFloat(1 - (Double(index) * 0.025)) } } var body: some View { Image(systemName: "circle") .foregroundColor(.red) .resizable() .scaledToFit() .frame(width: getSize(), height: getSize()) .opacity(getOpacity()) } }
内容的提问来源于stack exchange,提问作者John Sorensen
相关产品推荐
相关产品推荐

