gpt4 book ai didi

ios - 带有 UITextView 的 UIView 随 UIScrollView 的 dismiss interactive 一起移动

转载 作者:行者123 更新时间:2023-11-28 08:16:37 27 4
gpt4 key购买 nike

我已经搜索过这个问题并找到了点点滴滴但不是真正的副本。

我正在尝试创建一个 UITextView,它被封装在一个 UIView 中,它会根据它的内容动态改变它的高度,这很容易通过自动布局和禁用 UITextView 上的滚动来解决。

然后我希望 UITextView 以交互方式移动,键盘可以关闭也可以不关闭(通过在 UIScrollView 上设置交互关闭属性)。

这种整体行为将模仿文本输入在 iOS 消息上的工作方式——它几乎可以通过交互式关闭键盘很好地滚动,并在需要时增加高度。

到目前为止,我的尝试是创建一个占据整个 View 的 UITableView,以及另一个将封装 TextView 的 View ,它被水平约束并固定到 View Controller View 的底部。高度被排除在外,但自动布局可以通过其中的 UITextView 本质上确定尺寸。

如图所示:

enter image description here

到目前为止,在没有产生键盘的情况下,这在模拟器中工作得很好:

enter image description here

现在,为了将封装 View 固定到键盘上,我尝试将其用作 View Controller 上的输入附件 View ,为此,我必须首先将其从 View 中删除 Controller 的 View 层次结构。我不确定在哪里执行此操作(键盘将显示通知, TextView 应开始编辑委托(delegate)等?)因为到目前为止我尝试的所有操作都导致 View 作为键盘的附件 View 丢失(如果键盘确实显示)。

像这样:

enter image description here

来自:

import UIKit

class ViewController: UIViewController {

// MARK: - Outlets
@IBOutlet weak var inputTextview: UITextView!
@IBOutlet weak var genericInputContainer: UIView!

// MARK: - Properites
fileprivate var shouldAddInputContainerAsAccessory = false
override var inputAccessoryView: UIView? {
if shouldAddInputContainerAsAccessory {
return genericInputContainer
}
return nil
}

// MARK: - Actions
@objc fileprivate func keyboardWillShow(sender: Notification) {
}

fileprivate func observeNotifications() {
let keyboardWillShowAction = #selector(keyboardWillShow(sender:))
NotificationCenter.default.addObserver(
self,
selector: keyboardWillShowAction,
name: Notification.Name.UIKeyboardWillShow,
object: nil)
}

// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
observeNotifications()
inputTextview.delegate = self
}
}

extension ViewController: UITextViewDelegate {
func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
genericInputContainer.removeFromSuperview()
shouldAddInputContainerAsAccessory = true
return true
}

func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
shouldAddInputContainerAsAccessory = false
return true
}
}

我对尝试从现有 View 创建新 View 犹豫不决,因为我将向封装 View ( TextView 旁边)内的元素添加几个不同的动画/变换。

最佳答案

不是删除输入然后将其分配给您的键盘配件,而是使用键盘观察器获取键盘出现时的高度,然后调整文本输入的底部约束。您可以像这样获得键盘高度:

func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
self.keyboardHeight = keyboardSize.height
//debugPrint(keyboardHeight)
}
}

关于ios - 带有 UITextView 的 UIView 随 UIScrollView 的 dismiss interactive 一起移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42424428/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com