推送动画期间在输入附件视图中显示文本的奇怪延迟。

sal*_*aha 8 ios swift

当 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
        }
    }
Run Code Online (Sandbox Code Playgroud)

有没有人有解决这个问题的方法?

sal*_*aha 1

我提出了适用于 iOS 8 和 9 的解决方案。它还解决了 iOS 9 中出现的保留周期问题,该问题防止在使用 inputaccessoryview 时释放视图控制器。检查github 项目以获取更多详细信息。

经过大量的实验,我发现了相当老套的解决方案,但效果却很神奇。只需从下面列出的 AccessoryView 中继承您的实现附件视图即可。

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)
    }
}

 
Run Code Online (Sandbox Code Playgroud)