【问题标题】:inputAccessoryView appearing with animation after view appears in iOS在iOS中出现视图后出现动画的inputAccessoryView
【发布时间】:2018-03-23 06:54:50
【问题描述】:

我有一个 inputAccessoryView 用于聊天应用程序中的文本输入。我使用以下代码实现了 inputAccessoryView:

override var inputAccessoryView: UIView? {
     get {
          setupInputToolbar()
          return inputToolbar
     }
}
override var canBecomeFirstResponder: Bool {
     return true
}

这发生在作为 childViewController 的 viewController 中。我使用分段控件来显示这个带有 inputAccessoryView 的聊天 viewController。

我遇到的问题是 inputAccessoryView 只有在我将 self.becomeFirstResponder() 放在聊天 viewController(子)的 viewDidAppear() 中时才会显示。

如果我省略 self.becomeFirstResponder() 或将其放在 viewDidLoad() 或 viewWillAppear() 中,则不会显示 inputAccessoryView。

将它放在 viewDidAppear() 中的问题是它在视图已经在屏幕上之后显示动画,这不是我想要的。

【问题讨论】:

  • 你试过viewWIllLayoutSubviews吗?
  • 你的意思是把它放在哪里?
  • 您说“如果我省略 self.becomeFirstResponder() 或将其放在 viewDidLoad() 或 viewWillAppear() 中,则不会显示 inputAccessoryView”。试着把它放在viewWillLayoutSubviews()
  • 因为它被多次调用,所以检查isFirstResponder不要设置多次。
  • 将它放入 viewWillLayoutSubviews() 仍然会导致它在视图出现在屏幕上后出现动画

标签: ios swift xcode inputaccessoryview


【解决方案1】:

我首先通过向 ViewController 添加一个 viewHasPerformedSubviewLayoutAtLeastOnce 属性来完成此操作。

private var viewHasPerformedSubviewLayoutAtLeastOnce = false

使canBecomeFirstResponder 依赖于上述属性。

override var canBecomeFirstResponder: Bool {
    return viewHasPerformedSubviewLayoutAtLeastOnce
}

然后更新viewDidLayoutSubviews() 中的该属性并成为UIView.performWithoutAnimation 块内的第一响应者。

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if viewHasPerformedSubviewLayoutAtLeastOnce == false {
        viewHasPerformedSubviewLayoutAtLeastOnce = true
        UIView.performWithoutAnimation { becomeFirstResponder() }
    }
}

这一切都让人觉得有点 hacky,但它会导致视图出现时没有任何动画。

【讨论】:

  • 这有效并修复了 MessageKit 和 InputAccessoryView 的问题,但它也可能在 func inputAccessoryView() 返回 UIView() 时发生,因此在某些情况下它似乎是 UIKit 错误。
  • 这可行,但是一旦 viewController 被推送,就会添加 inputAccessoryView,这看起来真的很糟糕......(但我找不到更好的方法)
猜你喜欢
  • 2011-01-15
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多