【问题标题】:SwiftUI - How to make ScrollView not bounce when content is smaller than boundsSwiftUI - 如何在内容小于边界时使 ScrollView 不反弹
【发布时间】:2021-07-18 18:03:00
【问题描述】:

我正在尝试制作我的ScrollView

  • 当内容小于屏幕时不反弹
  • 当内容溢出屏幕时弹跳

这是我的代码:

struct ContentView: View {
    init() {
        UIScrollView.appearance().alwaysBounceVertical = false
    }
    var body: some View {
        ScrollView {
            Rectangle()
                .fill(Color.blue)
                .frame(height: 300) /// is smaller than the screen
                .padding()
        }
    }
}

我尝试设置UIScrollView.appearance().alwaysBounceVertical = false,但滚动视图仍然弹跳:

如果我这样做UIScrollView.appearance().bounces = false,它会停止弹跳。但是,如果我使矩形比屏幕高,它也会停止弹跳(这是我不想要的)。

Doesn't bounce (yay!) ... but doesn't bounce when the content overflows the screen

如何禁用弹跳,但仅当内容小于滚动视图的边界时?

【问题讨论】:

    标签: ios swift swiftui uiscrollview


    【解决方案1】:

    好吧,当使用SwiftUI-Introspect 时,将alwaysBounceVertical 设置为false 确实有效。我不确定为什么像你一样设置外观不起作用......

    无论如何,这里有一些工作示例代码:

    struct ContentView: View {
        
        @State private var count = 5
        
        var body: some View {
            VStack {
                Picker("Count", selection: $count) {
                    Text("5").tag(5)
                    Text("100").tag(100)
                }
                .pickerStyle(SegmentedPickerStyle())
                
                ScrollView {
                    VStack {
                        ForEach(1 ... count, id: \.self) { i in
                            Text("Item: \(i)")
                        }
                    }
                    .frame(maxWidth: .infinity)
                }
                .introspectScrollView { scrollView in
                    scrollView.alwaysBounceVertical = false
                }
            }
        }
    }
    

    结果(很遗憾你看不到我的鼠标试图拖动较短的列表):

    【讨论】:

    • 谢谢,效果很好!最好我会尽量避免使用任何库,但除非有人找到更好的方法,否则我会保留你的答案。
    • “不完全确定为什么像你那样设置外观不起作用”我怀疑 SwiftUI 会以某种方式覆盖默认值...回到 UIKit 我认为 alwaysBounceVerticalfalse默认,所以它不会反弹,除非你将它设置为true
    • @aheze 可能。并且必须在渲染之前设置它,因为即使使用计时器设置外观每秒多次也不起作用(表明它不是您在 init 中设置外观的时间问题)。
    猜你喜欢
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多