【问题标题】:SwiftUI List/Form/ScrollView being clipped when offsetSwiftUI List/Form/ScrollView 在偏移时被剪裁
【发布时间】:2020-08-24 04:43:04
【问题描述】:

我更改了列表的 y 偏移量,现在它被剪裁了。
我正在努力做到这一点,以便当您滚动时,您可以部分看到标题下方的文本和视图顶部的按钮。换句话说,我希望屏幕的顶部稍微透明。

我将偏移量添加到列表中,这样它就不会与顶部的信息重叠。

上图是我的代码中显示的 VStack。我认为 VStack 可能会碍事,所以我将其注释掉,结果如下图:

这是我的代码:

var body: some View {
    ZStack {

        VStack {
            HStack {

                Button(action: {self.showAccountView.toggle()}) {
                    Image(systemName: "person.fill")
                        .renderingMode(.original)
                        .font(.system(size: 20, weight: .bold))
                        .frame(width: 44, height: 44)
                        .modifier(NavButtons())
                }
                .sheet(isPresented: $showAccountView) {
                    AccountView()
                }
                Spacer()
                Button(action: { self.showHelpCenter.toggle()}) {
                    Image(systemName: "questionmark")
                        .renderingMode(.original)
                        .font(.system(size: 20, weight: .bold))
                        .modifier(NavButtons())
                }
                .sheet(isPresented: $showHelpCenter) {
                    HelpCenter()
                }
            }
            .frame(maxWidth: .infinity)
            .padding(.horizontal)
            Spacer()
        }
        List {
            ForEach (store.allLogs) { thing in
                VStack (alignment: .leading) {
                    HStack {
                        Text("\(thing.date) , \(thing.time)")
                    }
                    Text(thing.notes)
                        .multilineTextAlignment(.leading)
                }
            }
        }.offset(y: 50)

    }
}

编辑:

这是一种可能的解决方案:

struct MyList: UIViewRepresentable {
    func makeUIView(context: Context) -> UITableView {
        let view = UITableView()
        view.clipsToBounds = false

        return view
    }

    func updateUIView(_ uiView: UITableView, context: Context) {

    }
}

然后您将使用 makeUIView 和 updateUIView 来更新单元格。这只是一团糟,当时并没有真正使用 SwiftUI。

二次编辑
我在 scrollView 和表单中发现了这个问题:

黑色是背景。这是所有三个的代码:

Group {
        List ((0 ... 10), id: \.self) {
            Text("Row \($0)")
        }
        .offset(y: 200)
        .border(Color.blue, width: 3)
        .background(Color.black)

        ScrollView {
            Text("Text")
        }
        .foregroundColor(.white)
        .offset(y: 200)
        .border(Color.blue, width: 3)
        .background(Color.black)

        Form {
            Text("Text")
        }
        .offset(y: 200)
        .border(Color.blue, width: 3)
        .background(Color.black)
    }

这是列表的线框图:

下面是与List/Form/ScrollView等高的frame的名称:

列表:
PlainList.BodyContent
ListCore.Container
ListRepresentable
查看主机
表格包装器
更新CoalescingTableView

表格:
GroupList.BodyContent
ListCore.Container
ListRepresentable
查看主机
表格包装器
更新CoalescingTableView

滚动视图:
滚动视图体
系统滚动视图
查看主机
HostingScrollView

我猜我的问题已经从“我该怎么做……”变成了“为什么会这样?” 我很困惑到底发生了什么。

【问题讨论】:

    标签: swift swiftui-list swiftui swiftui-form


    【解决方案1】:

    使用LazyHStack 代替HStack 可以解决剪裁问题。

    【讨论】:

      【解决方案2】:
      UIScrollView.appearance().clipsToBounds = false
      

      将其粘贴在 AppDelegate.swift -> applicationDidFinishLaunchingWithOptions() 的主体中。默认情况下,它将使您的应用程序中的所有滚动视图都未剪辑。

      问题在于列表下面有一个表格视图(即滚动视图)。默认情况下,滚动视图被剪裁。我们只需要更改该默认值。

      【讨论】:

      • 如果我完全摆脱所有堆栈,只使用带有修饰符 .offset(y: 100) (((所以代码将是:struct ListView: View { var body: some查看 { List { Text("Some Text")}.offset(y: 100)}} 然后滚动,然后单元格仍然消失在某些东西下。(这就是您在第二张图片中看到的内容。
      • 我正在尝试做的是让您可以在文本消失时看到它。音乐应用中的标签栏和导航栏都展示了这种设计。
      • 我认为有一种方法可以使用普通的标签栏/导航栏 (medium.com/@mycroftservicer/…) 但我想用自定义视图做同样的事情,因为我的屏幕不需要标签栏或导航栏。此外,对于普通导航栏,当我向上滚动时,它会干扰我的 UI 的其余部分。
      • 我一直在关注设计+代码课程,在 SwiftUI 课程的第 2 部分视频 19 中,他展示了如何制作模糊效果。据我了解,模糊效果是 UIKit 中的东西,但在 SwiftUI 中还没有。为了解决这个问题,他制作了一个带有模糊效果的 UIViewRepresentable。这解决了如何使某些东西透明的问题,但它仍然没有解释为什么要剪切列表。
      • 对不起。我没明白你的意思。我现在明白了。我该怎么称呼它?
      猜你喜欢
      • 2021-09-10
      • 1970-01-01
      • 2017-03-30
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 2019-11-05
      相关资源
      最近更新 更多