2016-11-21 12 views
8
में सभी पाठ

एक उदाहरण मैंस्विफ्ट NSMutableAttributedString UITextView

Example Link

मैं इस तरह मेरी UITextView का लिंक जोड़ रहा बनाया है डाउनलोड परिवर्तन:

 let systemFont = self.text.font! 
       let linkAttributes = [ 
        NSFontAttributeName : systemFont, 
        NSLinkAttributeName: NSURL(string: alertController.textFields![0].text!)!] as [String : Any] 

       let myAttributes2 = [ NSForegroundColorAttributeName: customGreen] 

       let attributedString = NSMutableAttributedString(string: "\(urlName)") 

       // Set the 'click here' substring to be the link 
       attributedString.setAttributes(linkAttributes, range: NSMakeRange(0, urlName.characters.count))//(0, urlName.characters.count)) 

       self.text.linkTextAttributes = myAttributes2 
       self.text.textStorage.insert(attributedString, at: self.text.selectedRange.location) 

       let cursor = NSRange(location: self.text.selectedRange.location + "\(urlName)".characters.count, length: 0) 
       self.text.selectedRange = cursor 
       // self.text.font = systemFont 

लेकिन यह डालने के बाद , यह UITextView में सभी मौजूदा टेक्स्ट को उसी फ़ॉन्ट पर बदल देता है।

तो उदाहरण के लिए यदि मेरे पास बोल्ड है और कुछ और पाठ है जो इटालिक है, तो यूआरएल जोड़ने के बाद (जो सिस्टम फ़ॉन्ट है) यह सभी बोल्ड/इटैलिक टेक्स्ट सिस्टम फ़ॉन्ट पर रीसेट करता है ....

यदि कोई जानता है कि पिछले पाठ के वर्तमान फ़ॉन्ट को कैसे रखा जाए तो मैं वास्तव में सहायता की सराहना करता हूं।

किसी और स्पष्टीकरण के लिए बस नीचे एक टिप्पणी छोड़ दो!

किसी भी व्यक्ति को अग्रिम धन्यवाद जो मदद कर सकता है!

अद्यतन

मैं textDidChange

if text == " " { 
       //  let systemFont = self.text.font! 
       // let linkAttributes = [NSFontAttributeName : systemFont] 
        let attributes = [NSForegroundColorAttributeName: UIColor.black, NSFontAttributeName: self.text.font!] as [String : Any] 

        let attributedString = NSMutableAttributedString(string: text, attributes: attributes) 
        self.text.textStorage.insert(attributedString, at: range.location) 
        let cursor = NSRange(location: self.text.selectedRange.location+1, length: 0) 
        textView.selectedRange = cursor 
       return false 
      } 

में यहां पाठ बदलने हूँ मेरे पास है कि मैं एक जगह बनाने के और फ़ॉन्ट रीसेट तो मैं के रूप में टाइपिंग जारी रखने के लिए नहीं है इसलिए यूआरएल जोड़ने के बाद एक यूआरएल लिंक ... शायद समस्या है, लेकिन जब मैं सामान्य टाइप करता हूं और यूआरएल लिंक सेट नहीं करता हूं तो स्पेस बनाने के दौरान टेक्स्ट बदल नहीं रहा है ...

+1

आपका कोड ठीक लगता है, क्या आप कृपया अधिक विस्तृत कर सकते हैं? –

+0

@ जे। कौश वैसे, मैंने जो भी सोचा था। असल में यह मेरा यूआईटीएक्स्टव्यू है: ** यह कुछ बोल्ड टेक्स्ट ** है और __ यह कुछ इटैलिक टेक्स्ट__ है (अब तक फोंट के बहुत अलग प्रकार हैं) www.Google.com (यह सिस्टम फ़ॉन्ट टेक्स्ट है।इस लिंक को जोड़ने के बाद यह पिछले बोल्ड टेक्स्ट और इटैलिक टेक्स्ट को सेट करता है || सिस्टम फ़ॉन्ट टेक्स्ट (यहां सामान्य टेक्स्ट।) || और जाहिर है कि मैं पिछले बोल्ड टेक्स्ट और इटैलिक टेक्स्ट रखना चाहता हूं और सिर्फ लिंक को फ़ॉन्ट फ़ॉन्ट टेक्स्ट होना चाहता हूं।)। यकीन नहीं है कि अगर यह अब और मदद करता है ... यदि आप समझ में नहीं आते हैं तो मैं कोशिश करूँगा और बाद में एक उदाहरण प्राप्त करूंगा? –

+0

क्या आपने पिछली पंक्ति '// self.text.font = systemFont' को अनमोल किया था, क्योंकि यह मेरे ऐप पर काम कर रहा है, सुनिश्चित करें कि आप कहीं और UITextView पर फ़ॉन्ट नहीं बदल रहे हैं। –

उत्तर

4
let urlName = "google" 

@IBAction func btnPressed(_ sender: Any) { 

    let systemFont = UIFont.systemFont(ofSize: 11) 
    let linkAttributes = [ 
     NSFontAttributeName : systemFont, 
     NSLinkAttributeName: NSURL(string: "https://www.google.com")!] as [String : Any] 

    let myAttributes2 = [NSForegroundColorAttributeName: UIColor.green] 

    let attributedString = NSMutableAttributedString(string: "\(urlName)") 

    attributedString.setAttributes(linkAttributes, range: NSMakeRange(0, urlName.characters.count))//(0, urlName.characters.count)) 

    self.text.linkTextAttributes = myAttributes2 
    self.text.textStorage.insert(attributedString, at: self.text.selectedRange.location) 

    let cursor = NSRange(location: self.text.selectedRange.location + "\(urlName)".characters.count, length: 0) 
    self.text.selectedRange = cursor 
} 

यदि आप पाठ को प्रोग्रामेटिक रूप से जोड़ना चाहते हैं तो आपको टेक्स्ट व्यू को अपडेट करना चाहिए। इस स्थिति में textViewDidChange (_ :) प्रतिनिधि विधि का उपयोग न करें।

अद्यतन

मैं ड्रॉपबॉक्स से अपने कोड डाउनलोड किया है और यह करने के लिए कुछ परिवर्तन किए हैं। तो यहां मैं उदाहरण के लिए viewDidLoad() में टेक्स्ट व्यू टेक्स्ट बदल रहा हूं। मैंने कोड में दोबारा उपयोग करने के लिए दो स्थिरांक बनाए हैं, fontAttr नाम और आकार के साथ मूल फ़ॉन्ट है और fontColorAttrBlue मूल फ़ॉन्ट रंग है।

let fontAttr = UIFont(name: "Helvetica-Bold", size: 20) 
let fontColorAttrBlue = UIColor.blue 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let attrString = NSMutableAttributedString(string: "Hello World, How are you?", attributes: [NSFontAttributeName : fontAttr!, NSForegroundColorAttributeName: fontColorAttrBlue ]) 
    self.textView.delegate = self // you can set the delegate from the storyboard. 
    self.textView.attributedText = attrString 
} 

और मैं webLink(_ sender: AnyObject) कार्रवाई विधि से कोड self.textView.font = systemFont की इस पंक्ति को हटा चुके हैं, इतना है कि यह TextView का फ़ॉन्ट बदलने नहीं होता।

और अंत में textView(_:shouldChangeTextIn:replacementText:) बजाय जाँच उपयोगकर्ता " " स्ट्रिंग उपयोगकर्ता किसी भी स्ट्रिंग में प्रवेश किया है और फ़ॉन्ट पुन: उपयोग जिम्मेदार बताते हैं कि मैं शुरुआत में बनाया है ताकि उपयोगकर्ता किसी भी प्रकार में प्रवेश करती है, तो अगर मैं जाँच कर रहा हूँ में प्रवेश किया है, तो की विधि लिंक के बाद पाठ का यह मूल पाठ होगा और जैसा कि पाठ के लिए असाइन नहीं किया गया है।

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { 
    if text.characters.count > 0 { 
     let attributedString = NSMutableAttributedString(string: text, attributes: [NSFontAttributeName : self.fontAttr!, NSForegroundColorAttributeName: self.fontColorAttrBlue]) 
     self.textView.textStorage.insert(attributedString, at: range.location) 
     let cursor = NSRange(location: self.textView.selectedRange.location+1, length: 0) 
     textView.selectedRange = cursor 
     return false 
    } 
    return true 
} 
+0

मुझे पूरा यकीन है मेरा टेक्स्ट है, और जब मैं अपना ऐप लॉन्च करता हूं तो मैं इसे जोड़ नहीं रहा हूं। जब मैं बटन दबाता हूं तो मैं लिंक जोड़ता हूं। –

+0

उस संपादन में क्या बिंदु था? –

+0

@ जैक मैंने एक निरंतर urlName बनाया है, और कोड को आईबीएक्शन में डाला है ताकि हम उपयोगकर्ता एक बटन दबाएंगे जिसे कॉल किया जाएगा और निरंतर urlName UITextView टेक्स्ट के अंत में जोड़ा जाएगा। –