我有一个用于在聊天应用程序中输入文本的 inputAccessoryView。我使用以下方法实现了 inputAccessoryView:
override var inputAccessoryView: UIView? {
get {
setupInputToolbar()
return inputToolbar
}
}
override var canBecomeFirstResponder: Bool {
return true
}
这发生在一个 viewController 中,它是一个 childViewController。我使用分段控件来显示带有 inputAccessoryView 的聊天 View Controller 。
我遇到的问题是,仅当我将 self.becomeFirstResponder() 放在聊天 View Controller (子)的 viewDidAppear() 中时,inputAccessoryView 才会显示。
如果我省略 self.becomeFirstResponder() 或将其放在 viewDidLoad() 或 viewWillAppear() 中,则 inputAccessoryView 不会显示。
将它放在 viewDidAppear() 中的问题是它在 View 已经在屏幕上后显示动画,这不是我想要的。
最佳答案
我通过首先向 ViewController 添加一个 viewHasPerformedSubviewLayoutAtLeastOnce
属性来实现这一点。
private var viewHasPerformedSubviewLayoutAtLeastOnce = false
使 canBecomeFirstResponder
依赖于上述属性。
override var canBecomeFirstResponder: Bool {
return viewHasPerformedSubviewLayoutAtLeastOnce
}
然后在 viewDidLayoutSubviews()
中更新该属性并成为 UIView.performWithoutAnimation
block 中的第一响应者。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if viewHasPerformedSubviewLayoutAtLeastOnce == false {
viewHasPerformedSubviewLayoutAtLeastOnce = true
UIView.performWithoutAnimation { becomeFirstResponder() }
}
}
这一切都感觉有点老套,但它会导致 View 出现时没有任何动画。
关于ios - 在 iOS 中出现 View 后,inputAccessoryView 随动画一起出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46690918/