Apa yang terjadi dengan “HelveticaNeue-Italic” di iOS 7.0.3

100

Baru saja memutakhirkan iPod touch saya ke iOS 7.0.3 dan "HelveticaNeue-Italic" sepertinya telah menghilang. Ketika saya bertanya di telepon dengan:

[UIFont fontNamesForFamilyName:@"Helvetica Neue"]

Saya mendapatkan fontNames berikut (13):

HelveticaNeue-BoldItalic,
HelveticaNeue-Light,
HelveticaNeue-UltraLightItalic,
HelveticaNeue-CondensedBold,
HelveticaNeue-MediumItalic,
HelveticaNeue-Thin,
HelveticaNeue-Medium,
HelveticaNeue-ThinItalic,
HelveticaNeue-LightItalic,
HelveticaNeue-UltraLight,
HelveticaNeue-Bold,
HelveticaNeue,
HelveticaNeue-CondensedBlack

Ketika saya melakukan kueri yang sama yang berjalan di simulator, saya mendapatkan (14):

HelveticaNeue-BoldItalic,
HelveticaNeue-Light,
**HelveticaNeue-Italic,**
HelveticaNeue-UltraLightItalic,
HelveticaNeue-CondensedBold,
HelveticaNeue-MediumItalic,
HelveticaNeue-Thin,
HelveticaNeue-Medium,
HelveticaNeue-Thin_Italic,
HelveticaNeue-LightItalic,
HelveticaNeue-UltraLight,
HelveticaNeue-Bold,
HelveticaNeue,
HelveticaNeue-CondensedBlack

Adakah yang melihat ini?

---- Informasi baru ----

Saya kembali ke video WWDC 2013 "Menggunakan Font dengan Kit Teks" dan bagian yang menarik dimulai pada pukul 12:22. Pembawa acara berbicara tentang "MetaFonts" di OS X sebagai contoh. Apa yang dia katakan adalah bahwa font di bawah panggilan seperti:

+ (NSFont *)messageFontOfSize:(CGFloat)fontSize

tidak dijamin untuk mengembalikan font dasar yang sama di berbagai versi atau bahkan penggunaan yang berbeda. Contohnya adalah Lucinda Grande. Dia tampaknya tidak mengatakan bahwa penggunaan "HelveticaNeue-Italic" dapat berpindah dari satu versi ke versi lainnya.

Jadi saya membuat percobaan di iOS 7. Saya membuat font saya dengan kode berikut:

UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:@"Helvetica Neue" size:16.0];
UIFontDescriptor *symbolicFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];

UIFont *fontWithDescriptor = [UIFont fontWithDescriptor:symbolicFontDescriptor size:16.0];

Saya mendapatkan UIFont yang valid kembali untuk fontWithDescriptor dan ketika saya menanyakan font untuk fontName dengan:

[fontWithDescriptor fontName]

Aku kembali ...

HelveticaNeue-Italic

Pergi gambar ???

Jadi jawaban yang mungkin untuk 7.0.3 sepertinya adalah kode di atas.

---- Tweak lebih lanjut ----

Meskipun solusinya berhasil di atas, menurut saya itu tidak benar secara formal. Saya telah beralih ke solusi berikut

    UIFontDescriptor *fontDescriptor = [[UIFontDescriptor alloc] init];

    UIFontDescriptor *fontDescriptorForHelveticaNeue = [fontDescriptor fontDescriptorWithFamily:@"Helvetica Neue"];
    UIFontDescriptor *symbolicFontDescriptor = [fontDescriptorForHelveticaNeue fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];

    textFont = [UIFont fontWithDescriptor:symbolicFontDescriptor size:textFontPointSize];

Ini tampaknya melakukan semua hal yang benar. Saya mencoba pendekatan sebelumnya dengan keluarga font lain dan tampaknya menjadi bingung dengan fontName dan fontFamily. Semoga ini membantu!

Scott Sarnikowski
sumber
Saya telah melihat ini juga. Tidak tahu apa yang terjadi, tapi itu kemunduran.
ipodishima
Menariknya, Halaman di iOS 7.0.3 menampilkan Helvetica Neue Italic: i.stack.imgur.com/xpJKl.png
Leo Natan
Jadi sepertinya Anda menjawab pertanyaan saya dengan pertanyaan dan penelitian Anda sendiri, menggunakan deskriptor font memang menampilkan font miring di iPhone 7.0.3 saya.
Rick van der Linde
Ini juga merupakan masalah di iOS 7.0.4
s.ka

Jawaban:

31

Ini adalah bug Apple. Ini diperkenalkan di iOS 7.0.3 dan belum diperbaiki pada iOS 7.0.4. Tampaknya telah diperbaiki dalam pratinjau pengembang iOS 7.1. Berikut adalah kode (disediakan oleh Apple di forum pengembang) untuk mengatasi masalah tersebut:

#import <CoreText/CoreText.h>

CGFloat size = 14;
UIFont *font = [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];
if (font == nil && ([UIFontDescriptor class] != nil)) {
    font = (__bridge_transfer UIFont*)CTFontCreateWithName(CFSTR("HelveticaNeue-Italic"), size, NULL);
}

Perlu juga dicatat bahwa dalam versi Xcode saat ini (5.0.1 (5A2053)) font ini tidak terdaftar sebagai opsi dalam daftar drop-down Font di Interface Builder. Jadi jika sebelumnya Anda mengonfigurasi label dengan font ini, Anda akan melihat bahwa ui bingung dan label akhirnya diberi beberapa font dan ukuran lain saat runtime (lihat ui screencap di bawah). Untuk label yang dikonfigurasi di storyboard / xibs, Anda perlu mengatur ulang font di kode.

Untuk referensi di sini adalah diskusi masalah di forum pengembang.

masukkan deskripsi gambar di sini

Mike Vosseller
sumber
Anda mengatakan Anda mengganti semua penggunaan Anda dengan sesuatu yang lain. Dengan apa Anda menggantinya? Kami memperhatikan bahwa jika Anda menggantinya dengan HelveticaNeue-MediumItalic di file XIB, kami mendapatkan hasil yang salah di iOS 6 dan sebelumnya karena font tersebut tampaknya telah diperkenalkan di iOS 7.
GBegen
Saya menggantinya dengan HelveticaNeue-LightItalic. Tidak yakin kapan itu diperkenalkan. Aplikasi saya adalah iOS7 +
Mike Vosseller
7

Ini adalah bug di iOS 7.0.3.

Jika Anda secara eksplisit menggunakan HelveticaNeue-Italic, Anda dapat membuatnya menggunakan solusi ini:

UIFont* font = (__bridge_transfer UIFont*)CTFontCreateWithName(CFSTR("HelveticaNeue-Italic"), fontSize, NULL);

Namun, perhatikan bahwa solusi ini hanya akan berfungsi di iOS 7; itu tidak dapat diterapkan ke iOS 6 (karena CTFontRefdan UIFonttidak dijembatani bebas pulsa di iOS 6). Namun, di iOS 6 Anda cukup menggunakan kode pencarian font biasa.

Dave DeLong
sumber
4

Ini adalah keyakinan saya bahwa ini adalah bug. Saya telah mengajukannya seperti itu ke Apple. Sayangnya bagi saya, aplikasi saya sekarang mogok. Font ini digunakan di perpustakaan pihak ketiga yang saya gunakan. Banyak orang di Twitter melaporkan masalah.

David Lari
sumber
1
FYI: Saya baru saja menguji dan bug tersebut masih ada di iOS 7.0.4.
David Lari
3

Jika Anda secara dinamis mengakses font italic maka bukan mengakses font dengan nama [UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f] menggunakan [UIFont italicSystemFontOfSize:15.0f]ini bekerja dengan baik bagi saya.

Kapil Chandel
sumber
Ini mungkin solusi terbersih untuk masalah ini. Jika dukungan iOS 6 diperlukan, Anda dapat mencoba menjalankannya fontWithName:size:terlebih dahulu, dan jika hasilnya adalah nil, jalankan italicSystemFontOfSize:, yang seharusnya selalu mengembalikan sesuatu, dan setidaknya menghindari crash.
SaltyNuts
2

Saat ini saya tidak menemukan sesi tersebut tetapi mereka mengatakan sesuatu bahwa Anda tidak dapat mengandalkan font yang tersedia lagi di iOS7. Mereka bahkan dapat berubah selama masa pakai aplikasi Anda. Yang pada dasarnya berarti: Saat Anda menentukan font di aplikasi Anda, Anda kacau, gunakan deskriptor font atau font pilihan sebagai gantinya!

Michael Ochs
sumber
2
Kecocokan terdekat yang dapat saya temukan adalah asciiwwdc.com/2013/sessions/223 , tetapi sepertinya mereka merujuk ke fonta yang dapat didownload, bukan font yang disediakan sistem.
Hilton Campbell
Lihat informasi baru di atas. Saya pikir apa yang dikatakan presenter adalah bahwa Anda tidak dapat mengandalkan pemetaan "MetaFonts" ke font dasar yang sama di seluruh versi atau bahkan penggunaan. Saya tidak berpikir bahwa dia mengatakan itu bahkan kemungkinan bahwa sesuatu seperti "HelveticaNeue-Italic" bisa hilang.
Scott Sarnikowski
1

Saya telah menemukan solusi lain yang tampaknya berhasil. Saya keluar dari panggilan ke

[[UIFont italicSystemFontOfSize:12.0] fontName]

untuk melihat font miring sistem sebenarnya yang digunakan, dan menampilkan ".HelveticaNeueInterface-ItalicM3". Sebuah tes sederhana menunjukkan bahwa menggunakan

[UIFont fontWithName:@".HelveticaNeueInterface-ItalicM3" size:12.0]

berhasil! Membandingkannya secara visual, fonta yang dikembalikan oleh panggilan di atas tampak persis sama dengan font asli 'HelveticaNeue-Italic'.

Masalah ini hampir pasti merupakan bug ... Helvetica Neue adalah font default di iOS 7, jadi font di keluarga tersebut tidak boleh hilang. Semuanya bekerja dengan baik di Xcode v.5.0, tetapi segera setelah meningkatkan ke 5.0.1, masalah ini mulai muncul. Saya telah mengajukan bug dengan Apple mencatat sebanyak itu. Sampai saat itu, solusi ini tampaknya berhasil ...

Fateh Khalsa
sumber
1

Laporan bug yang saya ajukan ke Apple telah ditandai "Ditutup sebagai duplikat". Saya berharap itu berarti mereka menganggapnya bug. Namun, iOS 7.0.4 tidak memperbaiki bug tersebut.

David Lari
sumber
1
Saya mendapat tanggapan yang sama. Semoga mereka memperbaikinya.
Scott Sarnikowski
1

Bug tampaknya telah diperbaiki di iOS 7.1 beta 1. [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];mengembalikan font.

Leo Natan
sumber
Kabar baik, tapi itu masih di bawah NDA.
Vincent Tourraine
9
Saya akan mengambil risiko itu.
Leo Natan
0

Saya mengalami crash yang sama yang dulu hanya terjadi pada iOS 7.0.3 & 7.0.4, dan berfungsi dengan sempurna di semua versi lainnya. Setelah begitu banyak penyelidikan, saya mengetahui bahwa @ "HelveticaNeue-Italic" tidak tersedia di versi iOS 7.0.3 & 7.0.4, sehingga saya biasanya mengalami crash di versi tersebut.

Saya telah memperbaiki masalah dengan kode di bawah ini, ini mungkin membantu seseorang yang membutuhkan.

self.headerFont = [UIFont fontWithName:@"HelveticaNeue-Italic" size:16.0f];
if (self.headerFont == nil) {
    self.headerFont = [UIFont fontWithName:@"HelveticaNeue" size:16.0f];
}

Log kerusakannya adalah:

[__NSCFConstantString pointSize]: unrecognized selector sent to instance 
Suresh Durishetti
sumber
-1

Karena tidak ada yang menyebutkan apa pun tentang dukungan miring HelveticaNeue di UIWebView, saya pikir saya akan membagikan temuan saya.

Mulai 7.0.6, huruf miring biasa masih hilang di UIWebView dan tampaknya kembali ke UltraLightItalic dalam kelompok yang sama. Ini terlihat sedikit aneh ketika tepat di sebelah teks HelveticaNeue non-miring berbobot biasa karena jauh lebih ringan.

Solusi saya adalah menggunakan Helvetica biasa, bukan HelveticaNeue, tetapi hanya untuk huruf miring. Jadi jika Anda memiliki CSS yang terlihat seperti ini:

.myCssClass {
    font-family:HelveticaNeue;
    /* etc, etc */
}

... Anda akan menambahkan dua kelas lain untuk diganti <i>dan <em>:

.myCssClass i  { font-family:Helvetica; }
.myCssClass em { font-family:Helvetica; }

Font miring Helvetica biasa terlihat baik-baik saja dan saya rasa tidak ada yang akan memperhatikan bahwa itu bukan HelveticaNeue.

Brian Rak
sumber