2016-06-02 6 views
6

При использовании NSKernAttributeName оно помещает пробел в конце каждой строки, есть ли способ исправить это? Я могу установить, что приписанное значение находится в диапазоне:NSKernAttributeName пространство в конце строки в NSAttributedString

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

Но я не хочу устанавливать это для каждой строки.

Это тестовый код в детской площадке я использую

//: 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 

С результатом глядя, как это:

text with kerning at the end of a line

Вы можете увидеть пробелы в конце каждого из линии.

ответ

0

Это на самом деле определение того, как работает кернинг; он настраивает пространство между ядерным символом и местом следующего символа. Будет ли следующий персонаж нарисован или нет, не имеет значения.

Standard Attributes

Атрибут кернинг показывает, сколько следующий символ должен быть смещен от его смещения по умолчанию, как определено шрифта текущего персонажа; положительное ядро ​​указывает сдвиг дальше, а отрицательное ядро ​​указывает сдвиг ближе к текущему символу.

Если это помогает, подумайте об этом в текстовом процессоре. Если кернинг включен, и вы вводите символ, где бы вы ожидали, что точка ввода будет тогда? Ожидаемый ответ будет «смещен от только что введенного символа на количество ядер», как это происходит в случае по умолчанию для ядра, равного 0, правильно? Ну, это именно то, что происходит здесь: если вы зацикливаете последний символ строки, строка поэтому включает в себя последнее ядро.

Итак, правильная вещь, чтобы сделать здесь, - это обернуть логику dropLast() в расширении и назвать ее днем.

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

Это не появляется, чтобы решить эту проблему: http://i.stack.imgur.com/7Pwwv.png – richy

 Смежные вопросы

  • Нет связанных вопросов^_^