首页 > 解决方案 > UIStackView 内的 UITextField UIScrollView 内的 UIStackView 内的 UITextField 不使用键盘滚动

问题描述

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

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

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

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

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

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

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

有谁知道可能导致问题的原因?

更新:

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

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

标签: iosswift

解决方案


我找到了一个解决方案:

对我来说,问题是高度约束,但是当键盘未显示时启用约束会导致 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
}

推荐阅读