【问题标题】:UITextField inside UIStackView inside UIStackView inside UIScrollView not scrolling with keyboardUIStackView 内的 UITextField UIScrollView 内的 UIStackView 内的 UITextField 不使用键盘滚动
【发布时间】:2021-09-01 09:49:30
【问题描述】:

我有一个控制器,它以编程方式创建所需的视图,视图如下:

  1. 标题 = UIStackView
  2. body = UIScrollView 2.1 正文内容 = UIStackView 垂直
  3. 页脚 = UIStackView

视图 1、2、3 被添加到主视图 视图 2.1 添加到 2

布局完全按原样工作,应用的工作方式是从服务器获取一个 json 对象,其中包含需要添加到视图 1、2.1 和 3 的元素列表。

视图 1 和 3 不需要滚动。 视图 2.1 包含经常溢出屏幕的元素,因此需要滚动。

要添加的元素有多种类型,如UIImage、UIButton、UITextView、UITextField...

所有元素都完全添加到布局中,并且滚动继续工作没有任何问题,除非我专注于 UITextField,只要我专注,软键盘就会出现,如果我尝试滚动它,但是,尽快当我输入任何字符时,滚动视图会跳起来,滚动条变得非常小,我不能再正常滚动了。当我失去字段的焦点并且软键盘消失时,滚动问题仍然存在。

有谁知道是什么导致了这个问题?

更新:

我尝试使用约束。 工作版本的正文内容视图带有父视图的顶部和底部锚点(视图 2)。 移除这些约束并添加宽度和高度锚点会导致滚动视图不再滚动。

此外,我尝试手动设置滚动视图的 contentSize,但这也没有任何作用。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    我找到了解决办法:

    对我来说,问题是高度约束,但是当键盘不显示时启用约束会导致 UIScrollView 不滚动,所以我用键盘通知打开和关闭约束。

    这就是我最终做的事情

    初始化布局

    let bodyWrap = UIStackView() //2 UIScrollView
    let contentWrap = UIStackView() //2.1 body content
    let bodyAnchor:NSLayoutConstraint? //I used this on keyboard displayed
    contentWrap.leadingAnchor.constraint(equalTo: bodyWrap.leadingAnchor).isActive = true
    contentWrap.trailingAnchor.constraint(equalTo: bodyWrap.trailingAnchor).isActive = true
    /*
     * Add all needed subviews to contentWrap
     * Then...
     */
    contentWrap.setNeedsLayout()
    contentWrap.layoutIfNeeded()
    bodyAnchor = contentWrap.heightAnchor.constraint(equalToConstant: contentWrap.frame.height)
    

    然后当键盘出现时

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardShown(notification:)), name: UIResponder.keyboardDidShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardHidden(notification:)), name: UIResponder.keyboardDidHideNotification, object: nil)
    
    @objc func keyboardShown(notification: Notification){
        bodyAnchor!.isActive = true
    }
    
    @objc func keyboardHidden(notification: Notification) {
        bodyAnchor!.isActive = false
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-28
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 2019-06-16
      • 1970-01-01
      相关资源
      最近更新 更多