เกิดอะไรขึ้นกับ“ HelveticaNeue-Italic” บน iOS 7.0.3


100

เพิ่งอัปเกรด iPod touch เป็น iOS 7.0.3 และดูเหมือนว่า "HelveticaNeue-Italic" จะหายไป เมื่อฉันสอบถามทางโทรศัพท์ด้วย:

[UIFont fontNamesForFamilyName:@"Helvetica Neue"]

ฉันได้รับ fontNames ต่อไปนี้ (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

เมื่อฉันทำแบบสอบถามเดียวกันกับที่ทำงานในโปรแกรมจำลองฉันได้รับ (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

มีใครเห็นบ้างไหม

---- ข้อมูลใหม่ ----

ฉันย้อนกลับไปที่วิดีโอ WWDC 2013 เรื่อง "การใช้ฟอนต์กับชุดข้อความ" และส่วนที่น่าสนใจเริ่มต้นเวลา 12:22 น. ผู้นำเสนอพูดถึง "MetaFonts" ใน OS X เป็นตัวอย่าง สิ่งที่เขาพูดคือแบบอักษรภายใต้การโทรเช่น:

+ (NSFont *)messageFontOfSize:(CGFloat)fontSize

ไม่รับประกันว่าจะส่งคืนฟอนต์ต้นแบบเดียวกันในเวอร์ชันต่างๆหรือแม้แต่การใช้งานที่แตกต่างกัน ตัวอย่างของเขาคือ Lucinda Grande ดูเหมือนเขาจะไม่ได้บอกว่าการใช้ "HelveticaNeue-Italic" จะหายไปจากเวอร์ชันหนึ่งไปอีกเวอร์ชันหนึ่ง

ดังนั้นฉันจึงสร้างการทดลองใน iOS 7 ฉันสร้างแบบอักษรของฉันด้วยรหัสต่อไปนี้:

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

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

ฉันได้รับ UIFont ที่ถูกต้องกลับมาสำหรับ fontWithDescriptor และเมื่อฉันสอบถามแบบอักษรสำหรับ fontName ด้วย:

[fontWithDescriptor fontName]

ฉันกลับมาแล้ว ...

HelveticaNeue-Italic

ไปรูป ???

คำตอบที่เป็นไปได้สำหรับ 7.0.3 น่าจะเป็นโค้ดด้านบน

---- ปรับแต่งเพิ่มเติม ----

แม้ว่าวิธีแก้ปัญหาจะใช้ได้ผลข้างต้น แต่ฉันไม่คิดว่ามันถูกต้องอย่างเป็นทางการ ฉันเปลี่ยนไปใช้วิธีแก้ไขปัญหาต่อไปนี้แล้ว

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

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

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

ดูเหมือนว่าจะทำสิ่งที่ถูกต้องทั้งหมด ฉันลองใช้วิธีการก่อนหน้านี้กับตระกูลฟอนต์อื่นและดูเหมือนว่าจะสับสนกับ fontName และ fontFamily หวังว่านี่จะช่วยได้!


เคยเจอแบบนี้เหมือนกัน ไม่รู้ว่าเกิดอะไรขึ้น แต่นั่นค่อนข้างถดถอย
ipodishima

ที่น่าสนใจคือ Pages บน iOS 7.0.3 แสดง Helvetica Neue Italic: i.stack.imgur.com/xpJKl.png
Leo Natan

ดูเหมือนว่าคุณจะตอบคำถามของฉันด้วยคำถามและการค้นคว้าของคุณเองการใช้ตัวบอกแบบอักษรนั้นแสดงแบบอักษรตัวเอียงบน iPhone 7.0.3 ของฉัน
Rick van der Linde

นี่เป็นปัญหาใน iOS 7.0.4
s.ka

คำตอบ:


31

นี่คือบั๊กของ Apple เปิดตัวใน iOS 7.0.3 และยังไม่ได้รับการแก้ไขใน iOS 7.0.4 ดูเหมือนว่าจะได้รับการแก้ไขในตัวอย่างนักพัฒนาของ iOS 7.1 นี่คือรหัส (ที่ Apple ให้มาในฟอรัม dev) เพื่อแก้ไขปัญหา:

#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);
}

นอกจากนี้ยังเป็นที่น่าสังเกตว่าใน Xcode เวอร์ชันปัจจุบัน (5.0.1 (5A2053)) แบบอักษรนี้ไม่อยู่ในรายการเป็นตัวเลือกในรายการแบบเลื่อนลงแบบอักษรในตัวสร้างส่วนต่อประสาน ดังนั้นหากคุณกำหนดค่าป้ายกำกับด้วยแบบอักษรนี้ก่อนหน้านี้คุณจะสังเกตเห็นว่า UI นั้นสับสนและป้ายกำกับจะถูกกำหนดแบบอักษรและขนาดอื่น ๆ ในรันไทม์ (ดู ui screencap ด้านล่าง) สำหรับป้ายกำกับที่กำหนดค่าในสตอรีบอร์ด / xibs คุณจะต้องรีเซ็ตแบบอักษรในโค้ด

สำหรับการอ้างอิงนี่คือการอภิปรายของปัญหาในฟอรัม dev

ป้อนคำอธิบายภาพที่นี่


คุณบอกว่าคุณแทนที่การใช้งานทั้งหมดของคุณด้วยอย่างอื่น คุณแทนที่ด้วยอะไร เราสังเกตเห็นว่าหากคุณแทนที่ด้วย HelveticaNeue-MediumItalic ในไฟล์ XIB เราจะได้ผลลัพธ์ที่ไม่ถูกต้องใน iOS 6 และรุ่นก่อนหน้าเนื่องจากแบบอักษรนั้นได้รับการแนะนำใน iOS 7
GBegen

ฉันแทนที่ด้วย HelveticaNeue-LightItalic ไม่แน่ใจว่ามีการเปิดตัวเมื่อใด แอพของฉันคือ iOS7 +
Mike Vosseller

7

นี่คือบั๊กใน iOS 7.0.3

หากคุณใช้ HelveticaNeue-Italic อย่างชัดเจนคุณสามารถสร้างได้โดยใช้วิธีแก้ปัญหานี้:

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

อย่างไรก็ตามโปรดทราบว่าวิธีแก้ปัญหานี้จะใช้ได้กับ iOS 7 เท่านั้น ไม่สามารถปรับใช้กับ iOS 6 ได้ (เนื่องจากCTFontRefและUIFontไม่มีการเชื่อมต่อแบบโทรฟรีบน iOS 6) อย่างไรก็ตามบน iOS 6 คุณสามารถใช้รหัสค้นหาแบบอักษรปกติของคุณได้


4

มันเป็นความเชื่อของฉันว่ามันคือจุดบกพร่อง ฉันได้ยื่นเรื่องนี้กับ Apple น่าเศร้าสำหรับฉันตอนนี้แอปของฉันขัดข้อง แบบอักษรนี้ใช้ในไลบรารีของบุคคลที่สามที่ฉันใช้ หลายคนบน Twitter กำลังรายงานปัญหา


1
FYI: ฉันเพิ่งทดสอบและบั๊กยังคงมีอยู่ใน iOS 7.0.4
David Lari

3

หากคุณกำลังเข้าถึงแบบอักษรตัวเอียงแบบไดนามิกแทนที่จะเข้าถึงแบบอักษรตามชื่อให้ [UIFont fontWithName:@"HelveticaNeue-Italic" size:15.0f] ใช้[UIFont italicSystemFontOfSize:15.0f]สิ่งนี้ใช้ได้ดีสำหรับฉัน


นี่อาจเป็นวิธีแก้ปัญหาที่สะอาดที่สุดสำหรับปัญหานี้ หากจำเป็นต้องรองรับ iOS 6 คุณสามารถลองรันfontWithName:size:ก่อนได้และหากผลลัพธ์คือnilให้รันitalicSystemFontOfSize:ซึ่งควรส่งคืนบางสิ่งเสมอและอย่างน้อยก็หลีกเลี่ยงความผิดพลาด
SaltyNuts

2

ตอนนี้ฉันไม่พบเซสชันนี้ แต่พวกเขาบอกว่ามีบางอย่างที่คุณไม่สามารถพึ่งพาฟอนต์ที่มีอยู่อีกต่อไปบน iOS7 ซึ่งสามารถเปลี่ยนแปลงได้ตลอดอายุการใช้งานแอปของคุณ ซึ่งโดยทั่วไปหมายความว่า: เมื่อคุณระบุแบบอักษรในแอปของคุณคุณจะเมาใช้ตัวบอกแบบอักษรหรือแบบอักษรที่ต้องการแทน!


2
คู่ที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้คือasciiwwdc.com/2013/sessions/223แต่ดูเหมือนว่ามันหมายถึงฟอนต์ที่ดาวน์โหลดได้ไม่ใช่ฟอนต์ที่ระบบให้มา
Hilton Campbell

ดูข้อมูลใหม่ด้านบน ฉันคิดว่าสิ่งที่ผู้นำเสนอพูดคือคุณไม่สามารถวางใจได้ในการแมป "MetaFonts" กับฟอนต์ต้นแบบเดียวกันในเวอร์ชันต่างๆหรือแม้แต่การใช้งาน ฉันไม่คิดว่าเขาจะบอกว่ามันเป็นไปได้ที่บางอย่างเช่น "HelveticaNeue-Italic" จะหายไป
Scott Sarnikowski

1

ฉันพบวิธีแก้ปัญหาอื่นที่ดูเหมือนจะใช้ได้ผล ฉันออกจากระบบการโทรไปที่

[[UIFont italicSystemFontOfSize:12.0] fontName]

เพื่อดูว่าฟอนต์ตัวเอียงของระบบจริงที่ใช้คืออะไรและส่งกลับ ".HelveticaNeueInterface-ItalicM3" การทดสอบง่ายๆแสดงให้เห็นว่าการใช้

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

ได้ผล! เมื่อเปรียบเทียบด้วยสายตาแล้วแบบอักษรที่ส่งกลับมาจากการเรียกข้างต้นดูเหมือนจะเหมือนกับแบบอักษร 'HelveticaNeue-Italic' ดั้งเดิมทุกประการ

ปัญหานี้เกือบจะเป็นข้อบกพร่องอย่างแน่นอน ... Helvetica Neue เป็นฟอนต์เริ่มต้นใน iOS 7 ดังนั้นฟอนต์ในตระกูลนั้นไม่ควรขาดหายไป ทุกอย่างทำงานได้ดีใน Xcode v.5.0 แต่ทันทีหลังจากอัปเกรดเป็น 5.0.1 ปัญหานี้ก็เริ่มปรากฏขึ้น ฉันได้ยื่นข้อบกพร่องกับ Apple โดยสังเกตมาก ถึงเวลานั้นวิธีนี้ดูเหมือนจะใช้ได้ผล ...


1

รายงานข้อบกพร่องที่ฉันยื่นกับ Apple ถูกระบุว่า "ปิดเป็นรายการที่ซ้ำกัน" ฉันหวังว่านั่นหมายความว่าพวกเขาคิดว่ามันเป็นจุดบกพร่อง อย่างไรก็ตาม iOS 7.0.4 ไม่สามารถแก้ไขข้อบกพร่องได้


1
ฉันได้รับการตอบสนองเดียวกัน หวังว่าพวกเขาจะแก้ไขได้
Scott Sarnikowski

1

ข้อบกพร่องดูเหมือนจะได้รับการแก้ไขแล้วใน iOS 7.1 beta 1 [UIFont fontWithName:@"HelveticaNeue-Italic" size:size];จะส่งคืนแบบอักษร


ข่าวดี แต่ยังอยู่ภายใต้ NDA
Vincent Tourraine

9
ฉันจะรับความเสี่ยงนั้นเอง
Leo Natan

0

ฉันมีข้อผิดพลาดเดียวกันซึ่งเคยเป็นความผิดพลาดใน iOS 7.0.3 และ 7.0.4 เท่านั้นและทำงานได้อย่างสมบูรณ์ในเวอร์ชันอื่น ๆ ทั้งหมด หลังจากการตรวจสอบมากมายฉันได้ทราบว่า @ "HelveticaNeue-Italic" ไม่มีให้บริการในเวอร์ชัน iOS 7.0.3 และ 7.0.4 ดังนั้นฉันจึงเคยมีปัญหาเหนือกว่าในเวอร์ชันเหล่านั้น

ฉันได้แก้ไขปัญหาเกี่ยวกับรหัสด้านล่างซึ่งอาจเป็นประโยชน์สำหรับผู้ที่ต้องการความช่วยเหลือ

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

บันทึกข้อขัดข้องคือ:

[__NSCFConstantString pointSize]: unrecognized selector sent to instance 

-1

เนื่องจากไม่มีใครพูดถึงอะไรเกี่ยวกับการสนับสนุนตัวเอียง HelveticaNeue ใน UIWebView ฉันจึงคิดว่าจะแบ่งปันสิ่งที่พบ

ณ วันที่ 7.0.6 ตัวเอียงปกติยังคงหายไปใน UIWebView และดูเหมือนจะถอยกลับไปใช้ UltraLightItalic ในตระกูลเดียวกัน สิ่งนี้ดูแปลกเล็กน้อยเมื่ออยู่ถัดจากข้อความ HelveticaNeue ที่ไม่มีน้ำหนักปกติเนื่องจากมีน้ำหนักเบากว่ามาก

วิธีแก้ปัญหาของฉันคือใช้ Helvetica ธรรมดาแทน HelveticaNeue แต่ใช้สำหรับตัวเอียงเท่านั้น ดังนั้นหากคุณมี CSS ที่มีลักษณะดังนี้:

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

... คุณจะเพิ่มอีกสองคลาสเพื่อลบล้าง<i>และ<em>:

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

แบบอักษรตัวเอียง Helvetica ปกติดูดีและฉันไม่คิดว่าจะมีใครสังเกตเห็นว่าไม่ใช่ HelveticaNeue

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.