我的应用中有UITextView
,它应包含不可编辑且可点击的后缀(categoryString),类似于Facebook 'feeling, watching, eating,...' status。我的shouldChangeTextInRange
和textViewDidChange
方法如下所示:
func textViewDidChange(textView: UITextView) {
dispatch_async(dispatch_get_main_queue(), {
textView.selectedRange = NSMakeRange(self.globalInt, 0)
//On long press backspace, something goes wrong with
//NSMutableAttributedString, so I just clear textView
//and set it's text to categoryString again:
if(!textView.text.hasSuffix(self.categoryString)){
self.globalInt = 0
self.postTextView.font = Constants.Fonts.postTextCategory
textView.text = self.categoryString
textView.selectedRange = NSMakeRange(0,0)
}
})
self.myMutableString = NSMutableAttributedString(string: self.postTextView.text, attributes: [NSFontAttributeName:Constants.Fonts.postTextCategory!])
self.myMutableString.addAttribute(NSFontAttributeName, value: Constants.Fonts.postText!, range: NSRange(location: 0, length: maxGlobalInt))
self.postTextView.attributedText = self.myMutableString
}
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
var tempText : NSString = text
var currentText : NSString = textView.text
var textToReturn = currentText.length + (tempText.length - range.length)
if(text == "\n"){
textView.resignFirstResponder()
}
var signatureLength = count(categoryString)
globalInt = textToReturn - signatureLength
maxGlobalInt = textToReturn - signatureLength
if(range.location > textToReturn - signatureLength){
return false
}else{
return textToReturn <= 160 + signatureLength
}
}
UITextView
字体默认为粗体,因此我使用NSMutableAttributedString
更改UITextView
的可编辑部分的字体(您可以在textViewDidChange
中看到)。
第一个问题:当我编辑UITextView
,并希望将光标设置在文本中间某处时,我只能键入一个字符(甚至是退格键),然后光标自动移动到文本可编辑部分的结束位置。如果我将这些代码行添加到shouldChangeTextInRange
dispatch_async(dispatch_get_main_queue(), {
self.globalInt = range.location + 1
if(count(text) == 0){
self.globalInt = self.globalInt - 1
}else{
self.globalInt = range.location + 1
}
})
解决了我的问题,光标位置总是正常,但我有一个新的 - 表情符号字符没有正确显示:
我认为这是因为表情符号的字符长度,但我不知道如何解决这个问题?
第二个问题:如何使UITextView
无法编辑的部分可点击? (而不是在那里设置光标)