ios - 在 iOS 中出现 View 后,inputAccessoryView 随动画一起出现

标签 ios swift xcode inputaccessoryview

我有一个用于在聊天应用程序中输入文本的 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/

相关文章:

ios - 如何在 Firebase (Swift) 中使用安全规则限制子节点

ios - 应用程序在后台 Swift Xcode 时不播放音乐

ios - 首次启动/已登录 Storyboard View Controllers Swift

android - iOS 中 Localizable.strings 的基本样式

ios - 为 View 创建纹理背景

ios - iPad 版主详细信息应用程序

ios - 套接字未在 iOS Swift 中连接?

ios - 如何检索 autoId 以删除值

swift - 为什么减去 NSDecimalNumbers 不起作用 - Swift 3

iphone - 启用 Break On Exception 后,应用程序始终会在 Xcode 4.2 中的 main.m 中中断