2016-06-02 4 views
6

में लाइन के अंत में स्थान NSKernAttributeName का उपयोग करते समय यह प्रत्येक पंक्ति के अंत में एक स्थान डालता है, क्या इसे ठीक करने का कोई तरीका है? मैं इस श्रेणी मेंNSKernAttributeName स्थान एनएसएट्रिब्यूटेड स्ट्रिंग

NSRange(location: 0, length: self.text!.characters.count-1) 

लेकिन मैं इसे प्रत्येक पंक्ति के लिए सेट नहीं करना चाहता हूं।

text with kerning at the end of a line

आप में से प्रत्येक के अंत में रिक्त स्थान देख सकते हैं:

यह मैं

//: Playground - noun: a place where people can play 

import UIKit 
import XCPlayground 

var text = "Hello, playground\nhow are you?" 

let paragraphStyle = NSMutableParagraphStyle() 
paragraphStyle.paragraphSpacing = 50 
paragraphStyle.alignment = NSTextAlignment.Left 
paragraphStyle.lineBreakMode = NSLineBreakMode.ByTruncatingTail 

let attributes = [ 
    NSParagraphStyleAttributeName: paragraphStyle 
    , NSKernAttributeName: 20 
] 


let attributedString = NSAttributedString(string: text, attributes: attributes) 

let label = UILabel() 
label.attributedText = attributedString 
label.numberOfLines = 0 
label.textColor = UIColor.greenColor() 
label.backgroundColor = UIColor.orangeColor() 
label.sizeToFit() 
label.center = CGPoint(x: 500, y: 100) 


var text2 = "What's up\nWhere are you?" 
let attributedString2 = NSAttributedString(string: text2, attributes: attributes) 

let label2 = UILabel() 
label2.attributedText = attributedString2 
label2.numberOfLines = 0 
label2.textColor = UIColor.greenColor() 
label2.backgroundColor = UIColor.orangeColor() 
label2.sizeToFit() 
label2.center = CGPoint(x: 500, y: 250) 

var text3 = "Hello" 
let attributedString3 = NSAttributedString(string: text3, attributes: attributes) 

let label3 = UILabel() 
label3.attributedText = attributedString3 
label3.numberOfLines = 0 
label3.textColor = UIColor.greenColor() 
label3.backgroundColor = UIColor.orangeColor() 
label3.sizeToFit() 
label3.center = CGPoint(x: 500, y: 400) 

let holderView = UIView(frame: CGRect(x: 0, y: 0, width: 1000, height: 500)) 
holderView.backgroundColor = UIColor.lightGrayColor() 
holderView.addSubview(label) 
holderView.addSubview(label2) 
holderView.addSubview(label3) 

XCPlaygroundPage.currentPage.liveView = holderView 
परिणाम के साथ

उपयोग कर रहा हूँ एक खेल का मैदान में परीक्षण कोड इस तरह लग रही है रेखाएं।

उत्तर

0

यह वास्तव में कर्नेलिंग कैसे काम करता है इसकी परिभाषा है; यह कर्नेड चरित्र के बीच की जगह को समायोजित करता है और जहां अगला अक्षर होगा। चाहे कोई अगला चरित्र तैयार किया जाए या नहीं, अप्रासंगिक है।

Standard Attributes

कर्निंग विशेषता इंगित करता है कि कितना निम्नलिखित चरित्र को उसके डिफ़ॉल्ट ऑफसेट के रूप में वर्तमान चरित्र के फ़ॉन्ट द्वारा परिभाषित से स्थानांतरित किया जाना चाहिए; एक सकारात्मक कर्न एक शिफ्ट को आगे से इंगित करता है और एक नकारात्मक कर्न वर्तमान चरित्र के करीब एक शिफ्ट इंगित करता है।

यदि यह मदद करता है, तो इसे एक वर्ड प्रोसेसर में करने के बारे में सोचें। यदि कर्नाई चालू है, और आप एक चरित्र टाइप करते हैं, तो आप सम्मिलन बिंदु को कहां से उम्मीद करेंगे? अपेक्षित उत्तर "केवल टाइप किए गए चरित्र से कर्नेल की मात्रा से ऑफसेट होगा" जैसा कि कर्ना 0 के डिफ़ॉल्ट मामले में होता है, सही है? खैर, यह वही है जो यहां हो रहा है: यदि आप स्ट्रिंग के अंतिम अक्षर को देखते हैं, तो स्ट्रिंग में अंतिम कर्न शामिल है।

तो यहां करने के लिए सही बात यह है कि अपने ड्रॉपलास्ट() तर्क को एक एक्सटेंशन में लपेटें और इसे एक दिन कॉल करें। http://i.stack.imgur.com/7Pwwv.png:

0

एक विस्तार

import UIKit 
extension UILabel { 

    @IBInspectable var kerning: Float { 
     get { 
      var range = NSMakeRange(0, (text ?? "").characters.count) 
      guard let kern = attributedText?.attribute(NSKernAttributeName, atIndex: 0, effectiveRange: &range), 
      value = kern as? NSNumber 
      else { 
       return 0 
      } 
      return value.floatValue 
     } 
     set { 
      var attText:NSMutableAttributedString? 

      if let attributedText = attributedText { 
       attText = NSMutableAttributedString(attributedString: attributedText) 
      } else if let text = text { 
       attText = NSMutableAttributedString(string: text) 
      } else { 
       attText = NSMutableAttributedString(string: "") 
     } 

      let range = NSMakeRange(0, attText!.length) 
      attText!.addAttribute(NSKernAttributeName, value: NSNumber(float: newValue), range: range) 
      self.attributedText = attText 
     } 
    } 
} 

यह here

+1

यह does not उत्तर दिया गया बनाएं समस्या को हल करने के लिए प्रकट – richy

संबंधित मुद्दे