2014-01-15 2 views
30

В iOS 7 при навигации с использованием нового жестов-перехода от края экрана название кнопки «Назад» («Художники») исчезает от розового (в примере ниже) и с регулярным весом шрифта, чтобы быть черным и иметь жирный шрифт.Отрегулируйте расстояние между буквами в iOS 7

enter image description here

Мне кажется, что анимация использует две различные метки для того, чтобы достичь этого эффекта; один из них исчезает, когда другой исчезает. Однако Apple каким-то образом скорректировала шрифт так, чтобы обычная метка отлично накладывала на жирный шрифт, создавая иллюзию того, что одна метка меняется между двумя разными весами и цветами.

Они просто отрегулировали расстояние между буквами на обычном шрифте так, чтобы оно соответствовало полужирным? В таком случае, как это будет достигнуто в iOS 7? Есть ли у Text Kit какие-либо удивительные возможности для этого или как я должен это делать?

ответ

80

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

В Objective-C:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"The Clash"]; 
[attributedString addAttribute:NSKernAttributeName 
         value:@(1.4) 
         range:NSMakeRange(0, 9)]; 

self.label.attributedText = attributedString; 

В Swift:

let attributedString = NSMutableAttributedString(string: "The Clash") 
attributedString.addAttribute(NSKernAttributeName, value: CGFloat(1.4), range: NSRange(location: 0, length: 9)) 

label.attributedText = attributedString 

Более подробная информация о кернинге доступна в Typographical Concepts from the Text Programming Guide.

Я не думаю, что есть функция TextKit, которая автоматически сопоставляет шрифт между жирным шрифтом и обычным текстом.

+6

+1 для @ «The Clash» и полезный ответ ;-) – alasker

+0

Anyone знает о различиях для разметки букв и кернинга? Как я вижу, NSKernAttributeName относится к кернированию, но не к интервалу между буквами. – Andrej

+1

@Andrej Нет атрибута отслеживания - см. Http://www.devsign.co/notes/tracking-and-character-spacing –

0

С Swift 4 и iOS 11, NSAttributedStringKey имеет статическое свойство, называемое kern. kern имеет следующий declaration:

static let kern: NSAttributedStringKey 

Значение этого атрибута является NSNumber объект, содержащий значение с плавающей точкой. Это значение указывает количество точек, с помощью которых можно настроить символы пары символов. Кернинг предотвращает появление нежелательного пространства между конкретными символами и зависит от шрифта. Значение 0 означает, что кернинг отключен. Значение по умолчанию для этого атрибута: 0.

Следующий код показывает площадка возможную реализацию kern для того, чтобы иметь некоторое расстояние между буквами в вашем NSAttributedString:

import PlaygroundSupport 
import UIKit 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     let string = "Some text" 
     let paragraph = NSMutableParagraphStyle() 
     paragraph.alignment = .center 
     let attributes: [NSAttributedStringKey: Any] = [ 
      NSAttributedStringKey.kern: 2, 
      NSAttributedStringKey.paragraphStyle: paragraph 
     ] 
     let attributedString = NSMutableAttributedString(string: string, attributes: attributes) 

     let label = UILabel() 
     label.attributedText = attributedString 

     view.backgroundColor = .white 
     view.addSubview(label) 

     label.translatesAutoresizingMaskIntoConstraints = false 
     label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
     label.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true 
     label.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor).isActive = true 
    } 

} 

PlaygroundPage.current.liveView = ViewController() 
Смежные вопросы