ios - UIStackView 内的 UITextField UIScrollView 内的 UIStackView 内的 UITextField 不使用键盘滚动
问题描述
我有一个控制器,它以编程方式创建所需的视图,视图如下:
- 标头 = UIStackView
- body = UIScrollView 2.1 正文内容 = UIStackView 垂直
- 页脚 = UIStackView
视图 1、2、3 被添加到主视图 视图 2.1 被添加到 2
布局完全按原样工作,应用程序的工作方式是它从服务器获取一个 json 对象,其中包含需要添加到视图 1、2.1 和 3 的元素列表。
视图 1 和 3 不需要滚动。View 2.1 包含经常溢出屏幕的元素,因此需要滚动。
要添加的元素有多种类型,如 UIImage、UIButton、UITextView、UITextField...
所有元素都完全添加到布局中,并且滚动继续工作没有任何问题,除非我专注于 UITextField,只要我专注,软键盘就会出现,如果我尝试滚动它,但是,只要我输入任何字符,滚动视图都会跳起来,滚动条变得非常小,我不能再正常滚动了。当我失去该领域的焦点并且软键盘消失时,滚动问题仍在继续。
有谁知道可能导致问题的原因?
更新:
我尝试使用约束。工作版本的正文内容视图带有父视图的顶部和底部锚点(视图 2)。删除这些约束并添加宽度和高度锚点会导致滚动视图不再滚动。
此外,我尝试手动设置滚动视图的 contentSize ,但这也没有做任何事情。
解决方案
我找到了一个解决方案:
对我来说,问题是高度约束,但是当键盘未显示时启用约束会导致 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
}
推荐阅读
- ruby - 解决运行列表的食谱时出错:缺少食谱:没有这样的食谱'docker'
- jekyll - 获取某个类别的帖子计数,除非他们也没有特定类别
- python - 如何从 BeautifulSoup 中的 td 获得价值?
- javascript - 禁用在移动设备上悬停的需要
- huawei-mobile-services - 华为推送通知-不同优先级推送通知的时间延迟是多少?
- assembly - NASM 错误:非 64 位模式下的无效操作数
- ssis-2019 - 在SSIS中将逗号分隔的字符串列拆分为几行?
- node.js - 在 Dockerfile 中从 BitBucket 安装 node_modules
- jenkins - 如何使用詹金斯管道同时构建多个项目
- typescript - ESLint - TypeScript 类型/接口中函数参数的“no-unused-vars”