Nsattributedstring superscript styling

Chcę indeksować wszystkie instancje znaku ® w bloku tekstu (Zastrzeżenia prawne, oczywiście;)), a domyślny sposób NSAttributedString nie jest zbyt dobry.

Jeśli po prostu pozwolę znakowi być i użyję tylko niezmodyfikowanego NSString, będzie on renderowany w tym samym rozmiarze co wielka litera i będzie umieszczony mniej więcej w punkcie bazowym. Jeśli dodam atrybut indeksu górnego do NSAttributedString w następujący sposób:

[attrStr setAttributes:@{(NSString *)kCTSuperscriptAttributeName : @1} range:NSMakeRange(locationOfReg, 1)];

Znak jest usuwany z linii bazowej, jego rozmiar pozostaje niezmieniony, ale odstępy między wierszami są teraz wpływ, ponieważ podniesiony znak w przeciwnym razie ingerować w linii powyżej.

Do zilustrowania:

warianty (R)

Stworzyłem ten obraz w Photoshopie, gdzie pożądana pozycja została osiągnięta poprzez zmniejszenie rozmiaru znaku i przesunięcie linii bazowej. Wiem, jak zmienić rozmiar czcionki w iOS, ale zmiana linii bazowej wydaje się trudniejsza. Jakieś sugestie, jak to osiągnąć?

Edit: przypuszczam, że mógłbym użyć atrybutu górnego jako sposobu na przesunięcie linii bazowej w górę. Teraz dobrze byłoby znaleźć sposób, aby uzyskać bieżący rozmiar czcionki, a następnie zmniejszyć go, aby umożliwić stosowanie tej samej metody na blokach tekstu o różnej wielkości.

Author: SaltyNuts, 2014-01-29

3 answers

Następujący kod wydaje się działać:

UIFont *fnt = [UIFont fontWithName:@"Helvetica" size:20.0];

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"GGG®GGG"
                                                                                     attributes:@{NSFontAttributeName: [fnt fontWithSize:20]}];
[attributedString setAttributes:@{NSFontAttributeName : [fnt fontWithSize:10]
                                  , NSBaselineOffsetAttributeName : @10} range:NSMakeRange(3, 1)];

Tutaj wpisz opis obrazka

 66
Author: kovpas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-03 19:00:14

Wersja Swift:

let fnt = UIFont(name:"Helvetica", size:20.0)
let attributedString = NSMutableAttributedString(string:"GGG®GGG", attributes:[NSFontAttributeName : fnt!])
attributedString.setAttributes([NSFontAttributeName : fnt!.fontWithSize(10), NSBaselineOffsetAttributeName: 10], range: NSRange(location: 3, length: 1))
 6
Author: Esteban Chavarría Solano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-18 07:54:34

Swift 4.2

W moim przykładzie chcę zapisać jedną instancję symbolu nieskończoności, aby tytuł mojej etykiety wyglądał tak: Tutaj wpisz opis obrazka

let font = UIFont(name: "Helvetica", size: 14.0)

let attributedString = NSMutableAttributedString(string: "Solids(ΔE∞)•G7®", attributes: [NSAttributedStringKey.font : font!])

attributedString.setAttributes([NSAttributedStringKey.baselineOffset: -5], range: NSRange(location: 9, length: 1))

solidsLbl.attributedText = attributedString
 0
Author: Bartosz Kunat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-03 11:36:15