[英]SwiftUI zIndex inside List
List
內ForEach
內的視圖上的zIndex
屬性似乎不起作用,而如果您在ScrollView
內的 ForEach 內有zIndex
,它就可以了。
對我不起作用:
List {
ForEach { index
View()
.zIndex(index == 1 ? 1 : 0)
}
}
作品:
VStack {
ScrollView {
ForEach { index
View()
.zIndex(index == 1 ? 1 : 0)
}
}
}
有誰知道為什么?
似乎 zIndex 在SwiftUI (甚至 SwiftUI 2)中的List內不起作用。 一種解決方法可能是自省UITableViewCell並更改其層的zPosition ,如下所示;
var body: some View {
List {
Text("First Row")
.background(Color.green)
.padding()
.listRowZIndex(1)
Text("Second Row")
.background(Color.red)
.padding()
.listRowZIndex(0)
.offset(x: 0, y: -30)
}
}
然后創建 ViewModifier;
struct ListRowZIndex: ViewModifier {
@State var zIndex : CGFloat = 0.0
func body(content: Content) -> some View {
content.background(ListRowZindexHelperView(zIndex: zIndex))
}
}
extension View {
func listRowZIndex(_ index: CGFloat = 0.0) -> some View {
self.modifier(ListRowZIndex(zIndex: index))
}
}
要求的實施;
struct ListRowZindexHelperView: UIViewRepresentable {
let zIndex : CGFloat
let proxy = ListRowZindexHelperProxy(cellWrapper: UITableViewCellWrapper(cell: UITableViewCell()))
func makeUIView(context: Context) -> UIView {
return UIView()
}
func updateUIView(_ uiView: UIView, context: Context) {
proxy.catchUITableViewCell(for: uiView)
proxy.chnageZIndex(zIndex)
}
}
class ListRowZindexHelperProxy {
var uiTableViewCellWrapper: UITableViewCellWrapper
init(cellWrapper: UITableViewCellWrapper) {
uiTableViewCellWrapper = cellWrapper
}
func catchUITableViewCell(for view: UIView) {
if let cell = view.enclosingUITableViewCell() {
uiTableViewCellWrapper.uiTableViewCell = cell
}
}
func chnageZIndex(_ zIndex: CGFloat = 0.0) {
uiTableViewCellWrapper.uiTableViewCell.layer.zPosition = zIndex
}
}
class UITableViewCellWrapper {
var uiTableViewCell : UITableViewCell
init(cell: UITableViewCell) {
uiTableViewCell = cell
}
}
extension UIView {
func enclosingUITableViewCell() -> UITableViewCell? {
var next: UIView? = self
repeat {
next = next?.superview
if let asUITableViewCell = next as? UITableViewCell {
return asUITableViewCell
}
} while next != nil
return nil
}
}
結果; 預習
第二行在第一行之后,因為第一行現在具有更高的 zIndex
答案的靈感來自這個答案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.