有人能想到为什么在UITextView
中闪烁的光标不会出现吗? 我有一个自定义控件,它只是UIView
的子类,并且其中包含一个UITextView
,但在获取焦点时光标不会出现。 键盘出现并且随着你的输入文本也会出现,但是没有光标,我无法弄清楚原因。
有什么想法吗?...
有人能想到为什么在UITextView
中闪烁的光标不会出现吗? 我有一个自定义控件,它只是UIView
的子类,并且其中包含一个UITextView
,但在获取焦点时光标不会出现。 键盘出现并且随着你的输入文本也会出现,但是没有光标,我无法弄清楚原因。
有什么想法吗?...
你可能已经更改了自定义UITextView中的色调颜色。如果色调颜色与背景颜色相同(通常为白色),那么它将会看起来是透明的。
contentSize
和/或框架不当,因此它太小而无法显示,或者控件超出屏幕。请在模拟器中前往Debug->Color Blended Layers
以查看这些值是否设置正确。我更改了所有UITextView的色调颜色,下一个构建中光标开始显示。
简单的解决方法是通过引入延迟,然后调用firstResponder来解决问题,像这样:
-(void)begin{
[self performSelector:@selector(first) withObject:nil afterDelay:0.01f];
}
-(void)first{
[tf becomeFirstResponder];
}
DispatchQueue.main.async {
self.textView.becomeFirstResponder()
self.textView.insertText(" ")
self.textView.deleteBackward()
}
viewDidLoad
方法中调用了becomeFirstResponder
。我将这个调用移到了viewDidAppear
中,这样它就对我起作用了。我也遇到了同样的问题,尝试了给出的答案,但无法在textview中看到光标。 因为其他原因导致了这个问题。 所以如果你像我一样遇到了不常见的问题,这将对你有所帮助。
我有一个被覆盖的方法,它导致了光标可见性问题
override func caretRect(for position: UITextPosition) -> CGRect {
return .zero
}
所以我只是注释掉了这些行,对我来说它运行得很好
对我来说,问题不在于tintColor,而是由于覆盖了caretRect方法所导致的。删除这个方法解决了我的问题。
open override func caretRect(for position: UITextPosition) -> CGRect {
return CGRect.zero
}
以上的解决方案在我的情况下没有起作用。在我的情况下,问题是当UITableViewCell
的selectionStyle
不是none
时,充当光标的UIView
的isOpaque
设置为false
。这似乎只会在我还没有完全弄清楚的竞争条件下发生。
以下是我如何调试此问题的方法:
UITextFieldView
UIView
处于正确的位置,但它不会出现在UI中。UIView
,然后选择“Print Description...”。描述指示OPAQUE=NO
不幸的是,拥有此UIView
的UITextSelectionView
类是私有的,因此没有非hacky的方法可以编程方式更新isOpaque
。
然而,这似乎不是每个实现中都存在的问题,以下是我的视图之间的关系。
我的文本视图委托
extension FooViewController: UITextViewDelegate {
private func updateSelection(selectedIndex indexPath: IndexPath) {
if let oldSelected = self.table.indexPathForSelectedRow {
tableDelegate.tableView(table, didDeselectRowAt: oldSelected)
}
tableDelegate.tableView(table, didSelectRowAt: indexPath)
}
func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
guard let rowCell = getParentCell(forTextView: textView), // loops through table row cells
!rowCell.isSelected,
let indexPath = self.table.indexPath(for: rowCell)
else { return true }
updateSelection(selectedIndex: indexPath)
return false
}
以及我的表格代理:
class TableViewDelegate: NSObject, UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableView.ScrollPosition.none)
}
}