我的 SwiftUI 應用程式有一個奇怪的行為。我Path用線性漸變繪制了一個作為筆觸顏色。
這個路徑在我看來是這樣顯示的:
GeometryReader { proxy in
LinePath(width: proxy.size.width, height: proxy.size.height)
.stroke(gradient, lineWidth: 3)
}
.frame(height:200)
.padding()
( LinePathstruct extends Shapeand draw the Path)
當此代碼顯示在第一個視圖上時,它會正確繪制:

但是如果我在 NavigationLink 之后的第二個視圖中顯示它,繪制的線是“像素化”的:

由于它可能難以理解并且有相當多的代碼(對于網頁),我做了一個演示專案,您可以在這里獲得。
要測驗它,您可以打開testprojectApp.swift和評論/取消評論部分:
ContentView() // <--- Uncomment this to get the issue
//SubView() // <--- Uncomment this and it works
如果您呼叫SubView(LinePath繪制它的位置),它會起作用。如果你呼叫ContentView它會顯示一個按鈕來導航到SubView,它會繪制一條像素化的線。
筆記:
- 如果我不設定 a
height,它永遠不會像素化 (.frame(height:200))。 - 如果我不使用漸變而是使用簡單的顏色(如
.blue),則它永遠不會像素化。
編輯:我找到了一個“解決方法”,在它出現后重新繪制線條 0.01s 并改變它的高度。它在視覺上“有效”,但當然這不是一個好方法......
@State var height: CGFloat = 0
var body: some View {
GeometryReader { proxy in
LinePath(width: proxy.size.width, height: proxy.size.height)
.stroke(gradient, lineWidth: 3)
}
.frame(height:height)
.padding()
.onAppear() {
DispatchQueue.main.asyncAfter(deadline: .now() 0.01) {
height = 200
}
}
}
uj5u.com熱心網友回復:
您可以添加.drawingGroup()它似乎無需使用延遲即可解決問題:
GeometryReader { proxy in
LinePath(width: proxy.size.width, height: proxy.size.height)
.stroke(gradient, lineWidth: 3)
}
.frame(height:200)
.padding()
.drawingGroup() //<-- here
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/362378.html
