【问题标题】:UIScrollView: Content first appears too lowUIScrollView:内容首先显得太低
【发布时间】:2014-10-03 16:06:12
【问题描述】:

在发布大量代码之前,我想确保它不是一个众所周知的问题(独立于特定代码),所以首先我将大致解释一下我的问题:

在故事板中,我创建了一个 UIViewController,添加了一个 UIScrollView 以及另一个 UIView(分层子视图)。当键盘出现时,我需要滚动视图将内容向上推,以便文本字段保持可见。运行应用程序时,除了内容看起来比我的故事板中定义的更靠近屏幕底部之外,一切正常。一旦我点击文本字段,内容就会向上滚动(通过将scrollView.contentInsetscrollView.scrollIndicatorInsets 调整为(0.0, 0.0, keyboardSize!.height, 0.0))并且它的位置与预期的一样。当按下回车键时,键盘消失,内容再次向下滚动(通过将scrollView.contentInsetscrollView.scrollIndicatorInsets 调整为(0.0, 0.0, 0.0, 0.0))但现在一切都像我想要的那样,就像在故事板中定义的那样。

为了了解发生了什么,我还将viewDidLoad()keyboardDidShowkeyBoardDidHide 中的一些y 点打印到控制台,但是在比较它们时,它们都是相同的。我错过了什么?您需要查看我的代码的某些特定部分吗?

【问题讨论】:

  • 你试过在 viewDidLoad 中设置scrollView.contentInset and scrollView.scrollIndicatorInsets to (0.0, 0.0, 0.0, 0.0) 吗?
  • 是的,但初始位置保持不变@Putz1103
  • 哦,放入viewDidAppear()就可以了!您如何看待,这是一个优雅的解决方案,还是只是代码中缺少某些东西的解决方法?它实际上会影响什么?为什么在第一次加载视图时设置不同?

标签: ios uiscrollview


【解决方案1】:

设置时可以按需要工作

viewDidAppear(animated: Bool) {
    scrollView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
    scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
}

欢迎任何有关其他/更好解决方案的 cmets!

【讨论】:

  • 别忘了给super打电话。
  • @Kamchatka 我对编程很陌生:如果错过了调用 super 会发生什么?它总是需要吗?
  • 如果你在不调用 super 的情况下覆盖了一个方法,你覆盖了父类中定义的行为。添加对 super 的调用可确保您仍然保留在那里定义的任何行为。
【解决方案2】:

我刚遇到这个问题 - 我搞砸了上面所有的解决方案,终于找到了解决办法。

对我来说,我只需要在 ViewController 构造函数中翻转正确的开关:

public ViewController ()
{
    AutomaticallyAdjustsScrollViewInsets = false;
}

我怀疑 LoadView()、ViewWillAppear() 等的结果会相似...

【讨论】:

    【解决方案3】:

    你能检查一下吗:

    • edgesForExtendedLayout 包含上边缘
    • automaticallyAdjustsScrollViewInsets 设置在您的视图中 控制器?

    【讨论】:

    • 你能解释一下我应该在哪里设置这些以及如何设置吗? edgesForExtendedLayout 与哪个布局相关? automaticallyAdjustScrollViewInsets 是要设置在 viewDidLoad()?我不知道这是否是一个可接受的解决方案,但正如我最初帖子的 cmets 中所回答的那样,另一种解决方法完全解决了它。
    【解决方案4】:

    这个会更好,不会明显地“碰撞”视图上的第一个项目,而是在它显示给用户之前这样做:

    -(void)viewDidLayoutSubviews{
        [super viewDidLayoutSubviews];
        scrollView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
        scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多