【问题标题】:Setting a new contentSize to a UIScrollView causes it to scroll back to point x:0 y:0将新的 contentSize 设置为 UIScrollView 会导致它滚动回点 x:0 y:0
【发布时间】:2009-12-31 00:32:52
【问题描述】:

在我的应用程序中,我有一些动态更改UIScrollViewcontentSize 的逻辑。我遇到的问题是,当我更改 contentSize 时,它​​会将 contentOffset 设置为 CGPointZero 或类似的东西。

我猜你不能将contentSize 设置在UIScrollView 的中间。关于如何让它发挥作用的任何想法?

换句话说,我想将我的UIScrollViewcontentSize 更改一半并保留它的contentOffset

提前致谢,

fbr

【问题讨论】:

    标签: iphone objective-c uiscrollview


    【解决方案1】:

    在我的应用程序中,我有一个UIViewController,它有一个UIScrollView 作为它的根子视图。该滚动视图包含一个UIView,它充当我嵌入的UITextView 的容器。

    输入足够长的字符串会导致 textView 展开,随后更改 scrollView 的 contentSize 导致它将其内容偏移量重置为 0。查看堆栈跟踪我能够看到 _adjustContentOffsetIfNecessary 尝试调整contentSize 更改后立即的内容偏移量。

    我创建了一个 UIScrollView 的子类,它阻止了 _adjustContentOffsetIfNecessary 调整偏移量的初始尝试。

    class CustomScrollView: UIScrollView {
    
        private var oldContentSize: CGSize = .zero
    
        override var contentOffset: CGPoint {
    
            set {
                if oldContentSize == contentSize {
                    super.contentOffset = newValue
                } else {
                    super.contentOffset = super.contentOffset
                    oldContentSize = contentSize
                }
            }
    
            get {
                return super.contentOffset
            }
        }
    }
    

    当 contentSizes 相同时,我们正常调整偏移量。如果不同,我们保持偏移量不变并将 oldContentSize 更新为新大小,以便下次它可以接受更改其偏移量。

    【讨论】:

      【解决方案2】:

      正如您已经看到的,您不能通过更改 contentSize 来做到这一点,但您可以通过更改 contentOffset 并移动您的子视图来伪造它。 Daniel Tull 的DTKit libraryDTInfiniteGridView 类中的一个示例。

      【讨论】:

      • 我不熟悉这个库。你能告诉我他在代码中的哪个地方用 contentOffset 伪造了 contentSize。这就是我想要做的。我正在开发一个数据表,您可以在其中查看列和行中的数据,就像 Excel 电子表格一样。我想动态设置 contentSize 的原因是将用户限制为仅垂直和水平滚动。因此,如果我在 UIScrollView 中检测到垂直滚动,我将 contentSize 设置为宽度等于 UIScrollView 框架的宽度并保持高度。
      • 为什么不能使用 UIScrollView 的 directionalLockEnabled?
      【解决方案3】:

      UIScrollView 的setContentSize: 将设置它的 contentOffset(_adjustContentOffsetIfNecessary,调用了一个内部方法,它会在你的滚动视图上进行神秘的偏移更改。)

      设置所需内容偏移的一种方法是在滚动视图上执行setContentOffset:reqiredOffset animation:NO
      (requiredOffset 是针对新的 contentSize 计算的)。

      【讨论】:

        【解决方案4】:

        我认为您可以通过保存当前的contentOffset 来欺骗这个,在设置新的contentSize 之后,您可以使用setContentOffset:animated: 将滚动返回到原来的位置。希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          我不知道会使用哪种方法,

          - (void)viewDidLoad {
              [super viewDidLoad];
              srcv.contentSize = ?;
          }
          

          这里会出现什么并用“?”代替滚动模拟器

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-03
            • 1970-01-01
            • 1970-01-01
            • 2014-11-09
            • 2022-08-22
            相关资源
            最近更新 更多