如何使用正确显示的表情符号使UITextView的一部分不可编辑和可点击?

时间:2015-07-14 12:53:50

标签: ios iphone swift uitextview emoji

我的应用中有UITextView,它应包含不可编辑且可点击的后缀(categoryString),类似于Facebook 'feeling, watching, eating,...' status。我的shouldChangeTextInRangetextViewDidChange方法如下所示:

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

解决了我的问题,光标位置总是正常,但我有一个新的 - 表情符号字符没有正确显示:

BEFORE AFTER

我认为这是因为表情符号的字符长度,但我不知道如何解决这个问题?

第二个问题:如何使UITextView无法编辑的部分可点击? (而不是在那里设置光标)

0 个答案:

没有答案