当 UILabel 中的字符串在 UIViewController 上的 inputAccessoryView 中延迟显示时,我遇到了问题。我附上了演示此问题的 gif。将 SecondViewController 推送到导航堆栈后,inputAccessoryView 会短时间丢失文本。但我希望在打开屏幕后立即显示文本。
演示这个问题的实现非常简单。
class SecondViewController: UIViewController {
@IBOutlet var accessoryView: UIView!
override var inputAccessoryView: UIView {
return accessoryView
}
override func canBecomeFirstResponder() -> Bool {
return true
}
}
有人解决这个问题吗?
最佳答案
我提出了适用于 iOS 8 和 9 的解决方案。它还解决了 iOS 9 中出现的保留周期问题,该问题防止 View Controller 在使用 inputaccessoryview 时被释放。检查github project了解更多详情。
经过大量实验,我发现了一个非常棘手的解决方案,但效果很好。只需从下面列出的 AccessoryView 子类化您的实现附件 View 。
class AccessoryView: UITextField {
override var canBecomeFirstResponder: Bool {
return true
}
override func awakeFromNib() {
super.awakeFromNib()
disableShowingKeyboard()
hideCursor()
}
}
extension AccessoryView {
private func disableShowingKeyboard() {
inputView = UIView()
}
private func hideCursor() {
tintColor = UIColor.clear
}
override func accessibilityActivate() -> Bool {
return false
}
override var isEditing: Bool {
return false
}
override func caretRect(for position: UITextPosition) -> CGRect {
return .zero
}
override func selectionRects(for range: UITextRange) -> [UITextSelectionRect] {
return []
}
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(UIResponder.copy(_:)) || action == #selector(UIResponder.selectAll(_:)) || action == #selector(UIResponder.paste(_:)){
return false
}
return super.canPerformAction(action, withSender: sender)
}
override func addGestureRecognizer(_ gestureRecognizer: UIGestureRecognizer) {
if gestureRecognizer is UILongPressGestureRecognizer {
gestureRecognizer.isEnabled = false
}
super.addGestureRecognizer(gestureRecognizer)
}
}
extension AccessoryView {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
for view in subviews {
let _point = self.convert(point, to: view)
if !view.isHidden && view.isUserInteractionEnabled && view.alpha > 0.01 && view.point(inside: _point, with: event) {
if let _view = view.hitTest(_point, with: event){
return _view
}
}
}
return super.hitTest(point, with: event)
}
}
关于ios - 在推送动画期间在输入附件 View 中显示文本的奇怪延迟。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34234372/