当 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)
有没有人有解决这个问题的方法?
我提出了适用于 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)
| 归档时间: |
|
| 查看次数: |
645 次 |
| 最近记录: |