我有一个文本字段,其中包含UIInputView输入附件视图.
当我点击我的文本字段,键盘进入视图并且我可以看到附件视图的子视图,但它没有可见的背景.键盘动画完成后,UIInputView的背景将弹出视图.
在键盘动画仍在进行时,我该怎么做才能强制UIInputView的背景可见?
这是我的代码:
UIInputView *inputView = [[UIInputView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, CGRectGetWidth(self.bounds), 44.0f) inputViewStyle:UIInputViewStyleKeyboard];
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
button.frame = CGRectInset(inputView.bounds, 15.0f, 2.0f);
[button setTitle:@"Button" forState:UIControlStateNormal];
[inputView addSubview:button];
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0.0f, 0.0f, CGRectGetWidth(self.bounds), 44.0f)];
textField.inputAccessoryView = inputView;
[self addSubview:textField];
Run Code Online (Sandbox Code Playgroud) 我UITextView整个星期都试图调整大小.我不知道应该怎么做,所以我决定包括几乎所有相关的代码.
我有这个对话视图:

这conversationview是一个UIViewController具有UITableView内部(采用约束).我有一个自定义UIView子类ConversationToolbar设置为inputAccessoryView(UIViewController包含它可以成为第一个响应者,因此视图始终可见),包含2个子视图.一个用于UITextView左右按钮,一个用于表情符号.表情符号仅在点按左键时显示:

当选择一个时,它会以浮动标签显示:

UITextView当使用多行时,我现在无法调整大小.我曾尝试自己计算所有帧,但那时似乎与我的约束以某种奇怪的方式发生冲突.几乎总是UITextView要么太小,要么仅在我按另一个键来更新视图后调整大小.或者在UITextView键盘上变大,或者当键盘被解除时它会滑出视野.
我已经从我的代码中删除了所有调整大小的功能,我想知道我需要做些什么才能调整大小.
在我的ConversationViewController:
var toolbar: ConversationToolbar!
override var inputAccessoryView: UIView! {
get {
if toolbar == nil {
toolbar = NSBundle.mainBundle().loadNibNamed("ConversationToolbar", owner: nil, options: nil).last! as ConversationToolbar
toolbar.frame.size = CGSize(width: UIScreen.mainScreen().bounds.size.width, height: 80)
toolbar.delegate = self
toolbar.setDraft(conversation.draft)
}
return toolbar
}
}
Run Code Online (Sandbox Code Playgroud)
随着ConversationToolbar.xib:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6254" …Run Code Online (Sandbox Code Playgroud) 我正在使用一个inputAccessoryView,它使用以下UIView子类从一个nib加载:
class CustomInputAccessoryView: UIView {
@IBOutlet var containerView: UIView!
@IBOutlet var contentView: UIView!
@IBOutlet weak var button1: UIButton!
@IBOutlet weak var button2: UIButton!
@IBOutlet weak var textView: UITextView!
override var intrinsicContentSize: CGSize {
return CGSize.zero
}
override init(frame: CGRect) {
super.init(frame: frame)
setupInputAccessoryView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupInputAccessoryView()
}
func setupInputAccessoryView() {
self.translatesAutoresizingMaskIntoConstraints = false
Bundle.main.loadNibNamed("CustomInputAccessoryView", owner: self, options: nil)
addSubview(containerView)
containerView.frame = self.bounds
}
}
Run Code Online (Sandbox Code Playgroud)
我将视图分配给inputAccessoryView并通过以下方式设置它:
var customInputAccessoryView = CustomInputAccessoryView()
Run Code Online (Sandbox Code Playgroud)
inputAccessoryView正确加载并正确显示.问题是当我按下inputAccessoryView的textView并显示键盘时,我收到以下错误:
<_UIKBCompatInputView: ...; frame = …Run Code Online (Sandbox Code Playgroud) 在iOS浏览器表单上,附件栏显示"完成"按钮,下一个/上一个按钮可在字段之间移动.我想在附件栏上捕获完成按钮单击事件并执行一些自定义操作.欢迎使用JQuery/JQuery移动解决方案.
我不想使用模糊/焦点,因为即使在点击其他元素时也会调用模糊.我想在调用此完成按钮时提交表单,而在其他操作发生时不提交.
我已经尝试用keycode 13绑定keypress事件.但它只捕获当用户按下键盘底部的完成/提交键而不是附件栏上的按钮时的事件.
我有一个带有自定义附件视图的键盘。我可以通过注册keyboardWillShowNotification通知来获得它的高度:
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShowNotification(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
Run Code Online (Sandbox Code Playgroud)
和回调处理程序:
@objc fileprivate func keyboardWillShowNotification(notification: NSNotification) {
guard let keybrdEndFrame = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
return
}
print(">>>> height: \(keybrdEndFrame.size.height)")
}
Run Code Online (Sandbox Code Playgroud)
然而,在这keybrdEndFrame.size.height给了我键盘的高度 + 附件视图的高度。虽然在我的特殊情况下我知道附件视图的高度(因为我已经实现了它),所以我可以计算键盘的高度,我想知道是否有一个更通用的解决方案,我可以将计算与自定义附件视图。
所以我的问题是 - 有没有办法在没有附件视图的情况下检索键盘的高度?或者,有没有办法只检索当前与键盘一起显示的附件视图的高度?
我正在使用WKWebView,将内容可编辑的div作为富文本编辑器的核心,并希望修改键盘上方的顶部工具栏,该工具栏包含自动更正建议和格式按钮。(不知道这是否算作输入的附件视图)。
我发现一些帖子显示了如何删除该栏,但它们似乎都不起作用,理想情况下,我还是想保留自动更正部分。
至少有一个应用程序Ulysses可以做到这一点(尽管我不知道它是否具有网络视图):
确实,我非常确定我可以通过在键盘视图层次结构上进行手术来实现这一目标……但这似乎是一种乏味而脆弱的方法。
有没有更好的办法?
谢谢!
我想要一个像 iMessage 中那样的输入附件视图。该栏始终在屏幕底部可见。当 TextField 获得焦点时,键盘会跳入,并且栏会自动向上移动,同时停留在键盘顶部。
在 UIKit 中,ViewController 可以覆盖 inputAccessory 并成为第一个响应者。因此输入附件永久可见。我找不到在 SwiftUI 中执行此操作的方法。
当键盘弹出时,保存消息并填充屏幕的滚动视图必须相应缩小。向下拖动滚动视图和交互移动键盘时也是如此。拖动时必须调整视图的大小。
最重要的要求是,在拖动滚动视图(以交互方式向下移动键盘)时,这必须顺利工作。iMessage 或 WhatsApp 中的行为相同。输入附件必须在拖动时移动,并且滚动视图也必须调整大小。键盘关闭后,工具栏/输入附件必须在底部保持可见。
我阅读了InputAccessoryView / View Pinned to Keyboard with SwiftUI,但这与我的问题不相似。我需要工具栏可见,即使键盘未显示。此外,该问题中接受的答案在 iOS 15 中无法正常工作。拖动以关闭键盘会留下白色间隙。
在 UIKit 实现中,持有视图是一个带有键盘关闭交互集的 UITableViewController。这意味着,当显示键盘时,您可以拖动视图,并同时向下拖动键盘和附件视图,直到键盘消失。不过,附件视图仍然保留在底部。
在 UIKit 中的实现非常简单,如下所示。一切都是开箱即用的。
class ChatTableViewController: UITableViewController {
...
override var inputAccessoryView: UIView? {
return inputBar
}
override var canBecomeFirstResponder: Bool {
return true
}
...
}
Run Code Online (Sandbox Code Playgroud)
我已经构建了一个不断增长的UITextView连接到键盘,类似于股票消息应用程序,通过将.xib加载到键盘的inputAccessoryView中:
self.keyboardAccessoryView = [[[NSBundle mainBundle]
loadNibNamed:@"KeyboardAccessoryView"
owner:self options:nil]
firstObject];
Run Code Online (Sandbox Code Playgroud)
.xib看起来像这样,并且正在使用布局约束,以便当用户输入更多文本行时textView会垂直增长:

旋转和一切都很好,除了一个大错误 - 当文本是多行时,只有最底线处理触摸事件.这意味着用户无法在UITextView内滚动,因为他们的触摸事件被传递到后面的(深灰色)视图并转而滚动.他们也无法在前3行选择和编辑他们的文字.

我想我可以通过捕获所有点击事件的坐标并检查键盘是否打开以及UITextView有多高来做一个解决方法,然后选择正确的元素来接收触摸事件.但这是一个脆弱的解决方案,更复杂的旋转.在我的自动增长的文本视图方法中是否存在我缺少的东西,或者更容易修复?
这是我的代码:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let keyBoardToolBar = UIToolbar(frame: CGRectMake(0, 0, self.view.frame.size.width, 44))
keyBoardToolBar.barStyle = .Default
let flexSpaceKeyboardBarButtonItem = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
let doneKeyboardBarButtonItem = UIBarButtonItem(title: "Done", style: .Done, target: self, action: nil)
let wordKeyboardBarButtonItem = UIBarButtonItem(title: "Button 1", style: .Plain, target: self, action: nil)
var barItems: [UIBarButtonItem] = []
barItems.append(wordKeyboardBarButtonItem)
barItems.append(flexSpaceKeyboardBarButtonItem)
barItems.append(doneKeyboardBarButtonItem)
keyBoardToolBar.setItems(barItems, animated: true)
self.myTV.inputAccessoryView = keyBoardToolBar
}
Run Code Online (Sandbox Code Playgroud)
当我转动设备时,UIToolBar变黑了(点击再次查看此GIF)
那么无论如何要修复它?谢谢!
顺便说一句:在模拟器中,我看不到UIToolBar变黑了.
我有一个聊天应用程序的inputAccessoryView,它始终保持可见状态,并且停靠在屏幕底部,用于类似于大多数消息收发应用程序的文本输入。
当我呈现带actionSheet样式的alertController时,在呈现警报时,inputAccessoryView会在屏幕外动画,然后在解除警报时再次备份。这又会滚动我的tableView,这是不可取的。
之所以发生这种情况,是因为在显示警报时,聊天viewController放弃了firstResponder。
无论如何,当它的视图resignsFirstResponder出现时,是否要呈现一个alertController而不放弃firstResponder,还是将inputAccessoryView停靠在屏幕底部?
ios ×9
swift ×5
xcode ×3
keyboard ×2
xib ×2
autolayout ×1
cordova ×1
ios7 ×1
javascript ×1
jquery ×1
objective-c ×1
swiftui ×1
uikeyboard ×1
uitextfield ×1
uitoolbar ×1
wkwebview ×1