2012-11-03 12 views
6

Pytanie z góry:Czy możemy ustawić czcionkę NSFont lub jej styl czcionki zamiast zmieniać nazwę czcionki?

możemy bezpośrednio przejść do font-weight i informacje font-style dla nadana ciąg? Czy możemy stworzyć nowy ciąg, dla którego jesteśmy w stanie ustawić te informacje?

Wyjaśnienie:

W iOS 6, możesz przełączać wybrane jako pogrubienie lub kursywa. Ale sposób, w jaki to działa, jest irytujący: nie zmienia NSFontAttributeName, który Apple nam ujawnił (zmieniając nazwę czcionki z, na przykład, "HelveticaNeue" na "HelveticaNeue-Bold"). Zamiast tego zachowuje rodzinę czcionek jako "Helvetica Neue" i zmienia "grubość czcionki" na pogrubioną czcionkę w stylu. Jeśli było zapytać wystąpienie nadana tekstu do jego opisu, można zobaczyć coś takiego na swoich informacji czcionki:

NSFont = "<UICFFont: 0x1fbc53a0> font-family: \"Helvetica Neue\"; font-weight: bold; font-style: normal; font-size: 16px"; 

Stwarza to problem. Nie możemy zmienić czcionki, zachowując pogrubioną i pochyłą informację. Jeśli przeskoczysz przez obręcze skanujące stary łańcuch przypisany do informacji o stylu, tworząc nowy ciąg z nową czcionką, a następnie zmieniając nazwę atrybutu czcionki (używając, na przykład, "Courier-Bold" wszędzie tam, gdzie chcesz, aby to było pogrubiony), tworzysz nowy problem: jeśli spróbujesz zmienić czcionkę z powrotem na normalną (nie pogrubioną), zamiast tego będziesz mieć nazwę czcionki, np. "Courier-Bold" AND o wadze "pogrubionej", ponieważ informacja o stylu nie została jeszcze ustawiona na pogrubienie. A przełączanie nie zmieni oczywiście nazwy czcionki. Zasadniczo stworzyłeś czcionkę, której nie można już zmienić, gdy użytkownik przełącza zaznaczony tekst. Użytkownik wciśnie przycisk "pogrubiony" w menu kontekstowym, ale nic nie zrobi, ponieważ można śmiało powiedzieć, że śmiałość została zakodowana na stałe w nazwie czcionki.

Jeśli przejdziesz do innej trasy i spróbujesz zastąpić "toggleBoldface" i "toggleItalic" w swoim UITextView, nie będzie możliwe, aby rzeczywiście zapobiec zmianie informacji o stylu w łańcuchu stylu. Nie można, jak się wydaje, zmienić samej nazwy czcionki podczas zdarzenia toggle.

Jeszcze raz pytanie: czy możemy w jakiś sposób uzyskać bezpośredni dostęp do informacji o grubości czcionki i stylu czcionki? Czy możemy stworzyć nowy ciąg, dla którego jesteśmy w stanie ustawić te informacje? Rozwiązałoby to problem polegający na zamianie jednej czcionki na drugą i zachowaniu informacji o stylu.

i podwójną wyjaśnienie:

Mówimy o iOS. Po ustawieniu atrybutu fontów atrybutów (NSFontAttributeName) dla pewnego zakresu znaków, wewnętrznie iOS tworzy NSFont z ciągiem znaków. Łańcuch stylu będzie czytał "font-weight: normal; font-style: normal", jeśli samodzielnie ustawiłeś atrybut czcionki. Ale ten ciąg stylów jest miejscem przechowywania pogrubionej i pochylonej informacji ustawionej w UITextView (przez przełączanie).

+0

Musisz coś jeszcze raz zmodyfikować w swoim pytaniu: NSFont jest dla MacOS, a *** UIFont *** dla iOS; jakiej architektury używasz i/lub której klasy czcionek używasz? –

+0

Obawiam się, że to nie jest poprawne. Tworzysz NSFontAttributeName jako atrybut dla przypisanego ciągu znaków (wyznaczając UIFont), a wewnętrznie iOS zamienia go w NSFont. W związku z tym, kod, który zawierałem, mówi "NSFont" jest tym, co przeczytasz, jeśli poprosisz o kawałek przypisanego tekstu do jego opisu za pomocą NSLog. –

+0

Mówiąc dokładniej, informacja NSFont jest częścią tego, co przeczytasz, jeśli zapytasz NSAttributedString o jej opis. –

Odpowiedz

1

Wygląda na to, że możesz być w stanie stworzyć nowy CTFontRef użyciu CTFontAttributesRef gdzie masz ustawioną wartość dla kluczy atrybutów kCTFontWeightTrait i/lub kCTFontSymbolicTrait. To pomaga?

cf. CTFontDescriptorReference i CTFontReference

EDIT

, że to nie zadziała - Spojrzałem na niego sam ... więcejpozostawiając to tutaj na wypadek, gdyby ktoś inny miał ten sam pomysł.

+0

Po utworzeniu, w jaki sposób można go zastosować do NSAttributedString? Kiedy na przykład tworzę słownik atrybutów, czy można go użyć zamiast UFont podczas ustawiania NSFontAttributeName? –

+0

Och, wierzę, że to odpowiada na moje pytanie: przekształcenie CTFont w UIFont. http://stackoverflow.com/questions/6714858/iphone-convert-ctfont-to-uifont Zdarzę raport, jeśli wystąpi problem, lub zaakceptuję odpowiedź, jeśli zadziała. Ale myślę, że doprowadziłeś mnie do celu. Dzięki. –

+0

Ostatecznie nie sądzę, żeby to się udało. Jak rozumiem (i po kilku próbach), nie można używać czcionek CoreText w UITextView. Czy nie mam racji? –