【问题标题】:Disable scrolling upwards in UITextView in SwiftUI在 SwiftUI 的 UITextView 中禁用向上滚动
【发布时间】:2020-07-31 20:24:12
【问题描述】:

我在项目中使用 UITextView,我需要它只能向下滚动(不能向上滚动)。有没有办法可以相对容易地做到这一点?如果不是,我可能会继承 UIScrollView 或一些奇怪的东西,但我真的不想这样做。

这是我的基本 UIViewRepresentable 结构

struct TextView: UIViewRepresentable {
    
    typealias UIViewType = UITextView
    var configuration = { (view: UIViewType) in }
    
    func makeUIView(context: UIViewRepresentableContext<Self>) -> UIViewType {
        let view = UIViewType()
        view.isEditable = false
        
        return view
    }
    
    func updateUIView(_ uiView: UIViewType, context: UIViewRepresentableContext<Self>) {
        configuration(uiView)
    }
}

谢谢!

【问题讨论】:

    标签: ios swift swiftui uikit


    【解决方案1】:

    可以使用UITextView 的简单子类来处理平移手势激活。

    使用 Xcode 12 测试

    class BottomScrollTextView: UITextView {
        override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
            guard let gr = gestureRecognizer as? UIPanGestureRecognizer else { return true }
    
            return gr.translation(in: self).y < 0    // << allow only to down
        }
    
        private var _contentOffset = CGPoint.zero
        override var contentOffset: CGPoint {
            get { super.contentOffset }
            set {
                if newValue.y > super.contentOffset.y || self.isDecelerating {
                    super.contentOffset = newValue
                }
            }
        }
    }
    
    struct TextView: UIViewRepresentable {
    
        typealias UIViewType = UITextView
        var configuration = { (view: UIViewType) in }
    
        func makeUIView(context: UIViewRepresentableContext<Self>) -> UIViewType {
            let view = BottomScrollTextView()   // << here !!
    
            // ... other code
    
    

    【讨论】:

    • 我最初将此标记为解决方案,但是,我发现了一个缺陷。如果您开始向下滚动,然后以相同的动作向上滚动,则视图允许您查看上面的内容。
    【解决方案2】:

    UITextView 是 UIScrollView 的扩展,所以你可以直接在你的 makeUIView 函数中自定义可滚动性:

    func makeUIView(context: UIViewRepresentableContext<Self>) -> UIViewType {
        let view = UIViewType()
        view.isEditable = false
        view.bounces = false
        
        return view
    }
    

    这将阻止查看器向上滚动超出视图边界。如果您想阻止它们在向下滚动后向上滚动,我认为最好的方法是完全禁用滚动(view.isScrollEnabled = false),然后向对象添加自定义拖动手势,如果它只编辑视图它是向下。如果是这样的话,This tutorial 可能是一个有用的资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多