swiftui - 如何创建仅显示线条网格的自定义视图?
问题描述
我正在制作一个测试应用程序来看看使用 SwiftUI 是什么感觉,我希望我的测试应用程序有一个自定义视图,它是一个垂直线网格,间距指定为状态变量。
但是,我无法弄清楚如何在似乎没有自定义绘图方法的 UI 系统中执行此操作。
import SwiftUI
struct GridBackgroundView : View {
@State var horizontalSpacing: CGFloat = 48
@State var verticalSpacing: CGFloat = 48
@State var anchor: Anchor<CGPoint>.Source = .center
var numberOfHorizontalGridLines: UInt {
return // Something?
}
var numberOfVerticalGridLines: UInt {
return // Something?
}
var body: some View {
Group {
ForEach(0 ... numberOfHorizontalGridLines) { _ in
// Something?
}
ForEach(0 ... numberOfVerticalGridLines) { _ in
// Something?
}
}
}
}
#if DEBUG
struct GridView_Previews : PreviewProvider {
static var previews: some View {
GridBackgroundView()
}
}
#endif
我不知道在这些// Something?
区域放什么。SwiftUI 中没有内置线视图,我一生都无法找出视图的宽度(可能是因为这不是View
SwiftUI 中的 a 的一部分?)
解决方案
您可以SwiftUI
使用Path
(路径文档,教程)进行自定义绘图
要绘制网格,您可以使用以下内容:
struct ContentView : View {
var horizontalSpacing: CGFloat = 48
var verticalSpacing: CGFloat = 48
var body: some View {
GeometryReader { geometry in
Path { path in
let numberOfHorizontalGridLines = Int(geometry.size.height / self.verticalSpacing)
let numberOfVerticalGridLines = Int(geometry.size.width / self.horizontalSpacing)
for index in 0...numberOfVerticalGridLines {
let vOffset: CGFloat = CGFloat(index) * self.horizontalSpacing
path.move(to: CGPoint(x: vOffset, y: 0))
path.addLine(to: CGPoint(x: vOffset, y: geometry.size.height))
}
for index in 0...numberOfHorizontalGridLines {
let hOffset: CGFloat = CGFloat(index) * self.verticalSpacing
path.move(to: CGPoint(x: 0, y: hOffset))
path.addLine(to: CGPoint(x: geometry.size.width, y: hOffset))
}
}
.stroke()
}
}
}
推荐阅读
- regex - 有没有办法用括号替换我的代码中的所有 .at() 实例,而不改变里面的文本
- compatibility - Android 和 Java win 10 兼容性
- azure-sql-database - 这是 Azure SQL 中的 SQL 错误吗
- sed - 使用 -e 选项 (sed) 在一个命令中包含多个表达式
- c# - 检测 UNITY UI 图像仅在另一个图像或矩形变换内移动
- python - Gensim find vectors/words in ball of radius r
- javascript - vis-network在任何情况下如何获取节点中心和左上角的实时位置?
- python - 如何创建基于按钮的聊天机器人
- asp.net-core - 使用 MVC 客户端处理大型身份令牌的推荐方法是什么?
- java - 生命射线。排除搜索的默认关键字