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

标签 ios swift

当 UILabel 中的字符串在 UIViewController 上的 inputAccessoryView 中延迟显示时,我遇到了问题。我附上了演示此问题的 gif。将 SecondViewController 推送到导航堆栈后,inputAccessoryView 会短时间丢失文本。但我希望在打开屏幕后立即显示文本。

enter image description here

演示这个问题的实现非常简单。

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/

相关文章:

ios - 我从 imagepicker 返回后,viewcontroller 中的所有内容都消失了?

ios - 显示来自视频 swift 的预览图像

ios - 应用程序因 UIApplicationEndBackgroundTaskError 而崩溃

IOS - 如何通过触摸 View 之外的任何地方来隐藏 View

ios - 使用 swift 从 Hyperledger iroha 创建新帐户时出错

ios - Xcode 和 Distribution .ipa 应用程序配置文件

ios - ViewController.xib 未打开

ios - 如何将通知传递给 Swift 3 中观察者调用的方法

iphone - cellForRowAtIndexPath 未被调用所需的次数

arrays - Swift - 使用范围运算符将项目添加到数组,奇怪的行为