कस्टम स्थापित फ़ॉन्ट को UILabel में सही ढंग से प्रदर्शित नहीं किया गया है


83

मैं एक Helvetica Neue संघनित फ़ॉन्ट का उपयोग करने की कोशिश कर रहा हूँ जो मुझे Adobe Font Collection Pro पैकेज से मिला है। दुर्भाग्य से, यह गलत तरीके से आकर्षित होता है जब मैं इसे एक के भीतर उपयोग करता हूं UILabel

रेखा की ऊँचाई सही ढंग से गणना की जाती है (मुझे लगता है), लेकिन जब फ़ॉन्ट प्रदर्शित किया जाता है, तो इसे बाउंडिंग बॉक्स के बहुत ऊपर से जोड़ दिया जाता है। मैंने कॉल किया [myLabel sizeToFit]और केवल इस स्क्रीन कैप्चर का निर्माण करने के लिए चौड़ाई समायोजित की:

गलत फॉन्ट रेंडरिंग की स्क्रीन कैप्चर

फॉन्ट के बोल्ड और रेग्युलर वर्जन दोनों के साथ मेरी यही समस्या थी। मैं OSX से हेल्वेटिका नी बोल्ड के एक संस्करण को खींचने में सक्षम था और इसे अपने डिवाइस पर डाल दिया और यह ठीक दिखाता है (ऊपर की तस्वीर में हरे रंग की पृष्ठभूमि)।

फ़ॉन्ट फ़ाइल या मेरे कोड के साथ क्या गलत हो सकता है जो इसे इस तरह से आकर्षित करेगा?


क्या मैं किसी तरह यूआईएफओटी का एक उपवर्ग बना सकता हूं जो इन समस्याओं को ठीक कर सकता है?
माइक्यू

+1 - मेरे लिए एक ही मुद्दा। मैंने इसके साथ मदद करने के लिए ZFont का उपयोग करने की कोशिश की है, और यह कुछ हद तक मदद करता है, लेकिन लगभग पर्याप्त नहीं है। कुछ के साथ हो सकता है कि कैसे उन कस्टम फोंट के साथ व्याख्या की जाती है (कोई सुराग नहीं, वास्तव में - लेकिन मुझे यह सोचना होगा कि इसके साथ कुछ करना हो सकता है!)।
जो डी'एंड्रिया

नमस्ते! क्या आपको अंततः समाधान मिला? कृपया अपने प्रश्न का उत्तर दें यदि हाँ। अग्रिम में धन्यवाद।
सूट्स

दुर्भाग्य से, नहीं, मैंने नहीं किया। और मेरे पास लंबे समय तक मूल फ़ॉन्ट फ़ाइल तक पहुंच नहीं है, जिससे यह समस्या हुई। मुझे कोलूचिया का उत्तर पसंद है .. मैं केवल यही चाहता हूं कि मैं इसे अपने विशिष्ट मामले में परख सकूं।
माइकक्यू

बस इतना पता है, यह iOS7 में तय किया गया है।
यार

जवाबों:


125

मैंने एक समाधान पोस्ट किया है जिसमें पैचिंग ttf फ़ॉन्ट फ़ाइल यहाँ है :

यहाँ समाधान है कि मेरे कस्टम फ़ॉन्ट के लिए काम किया है जो UILabel, UIButton और में एक ही मुद्दा था। फ़ॉन्ट के साथ समस्या यह थी कि सिस्टम फोंट के मूल्य की तुलना में इसकी आरोही संपत्ति बहुत कम थी। Ascender फ़ॉन्ट के पात्रों के ऊपर एक ऊर्ध्वाधर व्हाट्सएप है। अपने फ़ॉन्ट को ठीक करने के लिए आपको Apple फ़ॉन्ट टूल सूट कमांड लाइन उपयोगिताओं को डाउनलोड करना होगा । फिर अपना फ़ॉन्ट लें और निम्न कार्य करें:

~$ ftxdumperfuser -t hhea -A d Bold.ttf

यह पैदा करेगा Bold.hhea.xml। इसे टेक्स्ट एडिटर से खोलें और ascenderविशेषता के मूल्य को बढ़ाएं । आपके लिए सबसे अच्छा काम करने वाले सटीक मूल्य का पता लगाने के लिए आपको थोड़ा प्रयोग करना होगा। मेरे मामले में मैंने इसे 750 से 1200 में बदल दिया। फिर अपने कमांड को फिर से ttf फ़ाइल में मर्ज करने के लिए निम्न कमांड लाइन के साथ फिर से उपयोगिता चलाएँ:

~$ ftxdumperfuser -t hhea -A f Bold.ttf

तो बस अपने अनुप्रयोग में परिणामी ttf फ़ॉन्ट का उपयोग करें।


इस उपकरण का सुझाव देने के लिए बहुत बहुत धन्यवाद! इसका उपयोग "-t नाम" अनुभाग को संपादित करके फ़ॉन्ट का नाम बदलने के लिए भी किया जा सकता है।
फिलिप

1
तुम भी कोशिश कर सकते हैं Mensis या FontForge। इन ऐप्स का उपयोग एस्केन्डर प्रॉपर्टी को बदलने के लिए भी किया जा सकता है।
कुलुचिया

1
आपने मेरा दिन बना दिया। मैं कई हफ्तों से इस समस्या से घिरा हुआ था। मैं इसे काफी बार उपयोग कर सकता हूं!
TheBeardedCoda 15

1
कृपया, ध्यान दें, कि यह बढ़ते हुए आप लाइन रिक्ति को बढ़ाएंगे - यह समस्या हो सकती है यदि आपके ऐप में मल्टीलाइन टेक्स्ट है।
पावेल अलेक्सीव

2
** कृपया यह भी देखें कि जोशीले जीव को यह पता है ** आपको आईओएस 6 और आईओएस 7 दोनों पर अच्छे संरेखण को सुनिश्चित करने के लिए दोनों एस्केंडर और सेटअप को शून्य पर सेट करना चाहिए!
केन एम। हाग्गर्ति

64

तो यह कोलूचिया के उत्तर का एक संशोधित संस्करण है ।

मैंने अपने फ़ॉन्ट को ग्लिफ़ के साथ खोला , और फिर इसे बिना किसी संशोधन के निर्यात किया। किसी तरह, जादुई रूप से, ऊर्ध्वाधर संरेखण मुद्दा चला गया था!

क्या बेहतर है कि नया फ़ॉन्ट अच्छी तरह से तरीकों के साथ खेलता है sizeWithFont:, इसलिए इसमें जोशुआ द्वारा उल्लिखित मुद्दे नहीं हैं ।

मैं आदेश kolyuchiy उल्लेख के साथ HHEA मेज पर एक दृष्टि डाली, और पाया है कि ग्लिफ़ बस नहीं संशोधित ascender, लेकिन यह भी lineGapऔर numberOfHMetricsमेरे लिए।

यहां पहले दिया गया कच्चा डेटा है:

versionMajor="1"
versionMinor="0"
ascender="780"
descender="-220"
lineGap="200"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="751"

और बाद में:

versionMajor="1"
versionMinor="0"
ascender="980"
descender="-220"
lineGap="0"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="748"

तो कहानी का नैतिक- केवल आरोही को बढ़ाना नहीं है, लेकिन अन्य संबंधित मूल्यों को भी संशोधित करना है।

मैं कोई टाइपोग्राफी विशेषज्ञ नहीं हूं इसलिए मैं वास्तव में क्यों और कैसे समझा सकता हूं। अगर किसी को एक बेहतर व्याख्या प्रदान कर सकते हैं यह बहुत सराहना की जाएगी! :)


टीटीएफ को बचाने के बाद मैं फिर से ग्लिफ़ का उपयोग कर रहा हूं, फ़ॉन्ट आईओएस 6 और आईओएस 7. पर बहुत समान व्यवहार करता है। पहले इसकी बेसलाइन को iOS 6 पर गलत बताया जाएगा।
leolobato

6
अंत में यह पता लगाने के लिए धन्यवाद! जाहिरा तौर पर iOS 6 लाइनगैप संपत्ति का सम्मान करता है, जबकि iOS 7 इसे अनदेखा करता है। इसका समाधान लाइनगैप 0 और एस्केन्डर को समान रूप से बड़ा करना है। यह वही है जो ग्लिफ़्स ने किया था, और यह iOS 6 और iOS 7 पर काम करता है
phatmann

हाँ। लाइनगैप को शून्य (0) तक कम करना और आरोही को छोड़ना (1991 में) ने फेडोरा के मुफ्त "ओवरपास" फ़ॉन्ट के साथ मेरे लिए समस्या हल कर दी। समाधान के लिए मार्गदर्शन के लिए आप सभी का धन्यवाद। IOS6 और iOS7 दोनों पर काम करता है।
स्टीफनहॉसर 15

मैं सिर्फ @ phatmann के रूप में ग्लिफ़ और OS X फ़ॉन्ट उपकरण के साथ कई असफल प्रयासों के बाद उसी निष्कर्ष पर आया था। बात यह है, यह बेहतर है कि इस ट्रिक को ओएस एक्स फॉन्ट टूल्स के साथ उपयोग करना बेहतर होगा बजाय केवल ग्लिफ़ के निर्यात के साथ, क्योंकि ग्लिफ़्स फ़ॉन्ट के स्टाइल नाम और पोस्टस्क्रिप्ट नाम को भी संपादित करता है, साथ ही एक्सकोड कुछ स्थितियों में फ़ॉन्ट को खोजने में विफल रहता है।
हुओंग

32

iOS 6 फ़ॉन्ट की लाइनगैप संपत्ति का सम्मान करता है, जबकि iOS 7 इसे अनदेखा करता है। तो 0 के लाइन गैप वाले केवल कस्टम फॉन्ट दोनों ऑपरेटिंग सिस्टम पर सही ढंग से काम करेंगे।

इसका समाधान लाइनगैप 0 और एस्केन्डर को समान रूप से बड़ा करना है। प्रति जवाब से ऊपर, एक समाधान आयात और ग्लिफ़ से निर्यात करने के लिए है। हालांकि, ध्यान दें कि ऐप का भविष्य का संस्करण इस "बग" को ठीक कर सकता है।

एक और अधिक मजबूत समाधान इस पोस्ट के अनुसार, फ़ॉन्ट को स्वयं संपादित करना है । विशेष रूप से,

  1. OS X फ़ॉन्ट उपकरण स्थापित करें।
  2. फ़ॉन्ट मैट्रिक्स को फ़ाइल में डंप करें: ftxdumperfuser -t hhea -A d YOUR_FONT.ttf
  3. डंप की गई फ़ाइल को एक संपादक में खोलें।
  4. इसमें ascenderसंपत्ति के मूल्य को जोड़कर संपत्ति को संपादित करें lineGap। उदाहरण के लिए, यदि lineGap200 है और ascender750 है, तो ascender950 बनाएं ।
  5. lineGap0 पर सेट करें ।
  6. फ़ॉन्ट में परिवर्तन मर्ज करें: ftxdumperfuser -t hhea -A f YOUR_FONT.ttf

एक बार जब आप ऐसा कर लेते हैं, तो आपको अपने UI को तदनुसार समायोजित करना पड़ सकता है।


4

हमारे कस्टम फोंट में से एक ही मुद्दा था। हमने फ़ॉन्ट एस्केंडर संपत्ति को संपादित करके समस्या को "ठीक" भी किया। हालांकि, हमने पाया कि इससे अन्य समस्याएं और लेआउट समस्याएं पैदा हुईं। उदाहरण के लिए, लेबल ऊंचाई के आधार पर गतिशील रूप से सेल ऊंचाई सेट करने पर हमारे एस्केन्डर एडिट किए गए फॉन्ट का उपयोग किया जाएगा।

हमने जो काम किया, वह UIButton contentEdgetInsets प्रॉपर्टी को बदल रहा था।

yourButton.contentEdgeInsets = UIEdgeInsetsMake(-10, 0, 0, 0);

निश्चित नहीं है कि कौन सी विधि बेहतर है, लेकिन समस्या को ठीक करने के लिए बस एक और तरीका साझा करना चाहता था।


2
माना। Ascender संपत्ति तय आदर्श समाधान नहीं है
अधिकतम MacLeod

1
हाय यहोशू, मैंने अभी एक तरीका पोस्ट किया है जो आपके द्वारा बताई गई समस्या को ठीक कर सकता है। संक्षेप में, आरोही के साथ कुछ और गुणों को संशोधित करने की आवश्यकता है।
जोसेफ लिन

4
  1. यहां से Apple के फ़ॉन्ट उपकरण डाउनलोड और इंस्टॉल करें: https://developer.apple.com/downloads/index.action?q=font (डाउनलोड लिंक नीचे में है)
  2. टर्मिनल खोलें और अपना फ़ॉन्ट जहाँ आपका फ़ॉन्ट है, वहां अपना cd करें
  3. यह आदेश चलाएँ: ftxdumperfuser -t hhea -A d MY_FONT_NAME.ttf
  4. अब आपके पास फ़ॉन्ट के कुछ गुणों के साथ एक xml फ़ाइल है, इसे अपने पाठ संपादक में संपादित करें
  5. "लाइनगैप" संपत्ति खोजें और इसके मूल्य में 200 जोड़ें
  6. Xml फ़ाइल सहेजें
  7. यह आदेश चलाएँ: ftxdumperfuser -t hhea -A f MY_FONT_NAME.ttf
  8. Xml फ़ाइल हटाएँ
  9. IOS 6 पर कॉन्फ़िगर किए गए फ़ॉन्ट का प्रयास करें और देखें कि क्या यह बेहतर दिखता है।
  10. यदि आपको आवश्यकता है, तो आप चरण 3 पर वापस जा सकते हैं और "लाइनगैप" संपत्ति में जोड़ / घटा सकते हैं। (मैं अपने विन्यास में 250 जोड़कर समाप्त हुआ)

4

OS X El Capitan चलाने वालों और इस थ्रेड पर आने के लिए, आपने देखा होगा कि Apple Font Tool Suite अब संगत नहीं है (कम से कम अभी के लिए)।

लेकिन आप अभी भी परिवर्तन द्वारा वर्णित प्रदर्शन कर सकते हैं kolyuchiy और यूसुफ लिन के साथ मुक्त फ़ॉन्ट संपादन सॉफ्टवेयर FontForge

FontForge के साथ फ़ॉन्ट खोलें और शीर्ष मेनू में तत्व का चयन करें, फिर फ़ॉन्ट जानकारी> OS / 2> मेट्रिक्स पर जाएं। वहां आप HHEAD लाइन गैप और HHead Ascent ऑफसेट मूल्यों को संपादित करना चाहते हैं।

एक बार जब आप आवश्यक संपादन कर लेते हैं, तो आप फ़ाइल> फ़ाइल को फ़ॉन्ट बनाएँ और सही फ़ॉन्ट प्रारूप चुनें


3

इस जवाब के लिए धन्यवाद मैंने अपनी समस्या ग्लिफ़ के साथ तय की, लेकिन थोड़ा अलग।

मैंने अपना फ़ॉन्ट ग्लिफ़्स के साथ खोला (ग्लिफ़्स मिनी के साथ भी काम करता है) और इस खंड को वहाँ पाया (यह ग्लिफ़्स मिनी से, दाएं शीर्ष कोने में पुश बटन बटन प्राप्त करने के लिए):

यहाँ छवि विवरण दर्ज करें

बस इस सभी संरेखण क्षेत्रों (या उनमें से कुछ) को हटा दें और यह इस समस्या को ठीक कर देगा। मेरे लिए पूरी तरह से काम किया।


2

आपके लेबल्स टेक्स्ट से एट्रिब्यूटेड टेक्स्ट बनाना मेरे लिए फिक्स था। एक विस्तार:

extension UILabel {
    /// You can call with or without param values; without will use default 2.0
    func setLineSpacing(lineSpacing: CGFloat = 2.0, lineHeightMultiple: CGFloat = 2.0) {
        guard let labelText = self.text else { return }
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.lineHeightMultiple = lineHeightMultiple
        let attributedString:NSMutableAttributedString
        if let labelattributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelattributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }
        // (Swift 4.2 and above) Line spacing attribute
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
        self.attributedText = attributedString
    }
}

मेरे कस्टम फ़ॉन्ट के लिए मुझे वह परिणाम मिला जिसकी मुझे आवश्यकता है:

self.myLabel.setLineSpacing(lineSpacing: 1.2, lineHeightMultiple: 1.2)

यह मूल निवासी का उपयोग करके काम करता है NSMutableParagraphStyle()जिसमें लाइन ऊंचाई और रिक्ति गुण होते हैं (जो @IBOutletस्टोरीबोर्ड में गुणों के रूप में सुलभ हैं , भले ही आप अपने लेबल को प्रोग्रामिंग नहीं कर रहे हों)।


1

क्या आपने कोर पाठ आजमाया है ? मुझे कोर पाठ के माध्यम से कस्टम फोंट प्रदान करने में कुछ सफलता मिली है, लेकिन मुझे नहीं पता कि यह आपकी स्थिति में फिट होगा या नहीं।


1
मैं पुष्टि कर सकता हूं कि मूल पाठ में यह समस्या नहीं है।
3

1

मैंने https://github.com/fonttools/fonttools का उपयोग किया है - बहुत आसान उपयोग और मुफ्त। मेरे मामले में, 'आरोही' = 1000 और 'लाइनगैप' = 0 का परिवर्तन 'हिया' तालिका में किया गया था।

ट्रेवर हार्मन https://medium.com/@thetrevorharmon/how-to-use-apples-font-tools-to-tweak-a-font-a386600255ae के लेख पर आधारित


0

यदि आप इन कमांड लाइन उपयोगिताओं से परेशान हैं, तो विंडो पर फ़ॉन्टक्रेटर का प्रयास करें। और इसके सेटिंग मेन्यू से फॉन्ट एसेन्डर को बदलें।


0

जो कोई उपयोग करने के लिए संघर्ष कर रहे हैं के लिए ftxdumperfuser( kolyuchiy जवाब) मैक ओएस मोजावे पर क्योंकि आदेश की त्रुटि नहीं मिला:

  • Apple से फ़ॉन्ट उपकरण पैकेज डाउनलोड करें। उन्हें https://developer.apple.com/download/more/?q=font पर मिला , XCode 11 के लिए एक को चुना।
  • Dmg फ़ाइल माउंट करें
  • डिस्क छवि cd / Volumes / macOS \ Font \ Tools दर्ज करें
  • पैकेज को अपने चयन के फ़ोल्डर में निकालें: pkgutil --expand-full macOS \ Font \ Tools.pkg ~ / font-tools
  • CLI उपकरण अब ~ / font-tools / FontCommandLineTools.pkg / पेलोड में उपलब्ध हैं, आप फ़ोल्डर को अपने पथ में जोड़ सकते हैं ( export PATH="$PATH:$HOME/font-tools/FontCommandLineTools.pkg/Payload"), या अपने बिन फ़ोल्डर में बर्तनों को कॉपी कर सकते हैं ।

-3

मैं अपने स्प्राइट किट गेम में प्रतिष्ठित "FontAwesome" फ़ॉन्ट के साथ एक समान मुद्दा था। SKLabelNode की SKLabelVerticalAlignmentMode प्रॉपर्टी को .Center में सेट करना मेरे लिए काम करता है।

myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center

बस किसी को उसी समस्या से जूझ रहे मामले में साझा करना चाहता था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.