আইওএস 7-এ গতিশীল পাঠ্য মাপের সাথে কীভাবে কাস্টম ফন্ট ব্যবহার করবেন


88

আইওএস 7-তে এমন একটি ফন্ট পাওয়ার জন্য নতুন এপিআই রয়েছে যা ব্যবহারকারীরা তাদের পছন্দগুলিতে সেট করা পাঠ্যের আকারের সাথে স্বয়ংক্রিয়ভাবে সামঞ্জস্য হয়।

এটি ব্যবহার করার জন্য এটি দেখতে এমন কিছু দেখাচ্ছে:

UIFont *myFont = [UIFont fontWithDescriptor:[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size:0];

এখন আপনি এটিকে যে কোনও পাঠ্য নিযুক্ত করেন তা ব্যবহারকারী হ'ল সিস্টেমের পাঠ্য আকারের সেটিং পরিবর্তন করে ফন্ট আকারে নীচে চলে যাবে। ( name:UIContentSizeCategoryDidChangeNotificationবিজ্ঞপ্তিটি শুনতে এবং আকার পরিবর্তন করার জন্য অ্যাকাউন্টে আপনার ভিউ আপডেট করতে ভুলবেন না)।

আমি ডিফল্ট হেলভেটিকা-নিউ ছাড়া অন্য কোনও ফন্টের সাথে ডায়নামিক পাঠ্য কীভাবে ব্যবহার করব?


আপনার কি উত্তর গ্রহণের সময় নেই?
খানহ এনগুইন

আইওএস -11 + থেকে, অ্যাপল কাস্টম গতিশীল ফন্ট আকারগুলি ব্যবহার করতে সহায়তা দেয়। বাস্তবায়নের জন্য দয়া করে এই উত্তরটি দেখুন
উমায়ের আলী

উত্তর:


132

সেই এপিআই-এর পর্দার আড়ালে, আপেলের মধ্যে কিছু ধরণের লুকিং টেবিল রয়েছে যা একটি নির্দিষ্ট ফন্ট পরিবার, আকার এবং কখনও কখনও প্রতীকী বৈশিষ্ট্যগুলি (যেমন সাহসের মতো) দেয় যা (যেমন UIFontTextStyleHeadline) এবং ব্যবহারকারীর পছন্দের পাঠ্যের আকার দেয় size দ্বিতীয়টি এর sharedApplicationমতো করে টানা একটি স্ট্রিং :

[UIApplication sharedApplication].preferredContentSizeCategory;

(আমি বিভিন্ন গতিশীল পাঠ্য মাপের জন্য হেলভেটিকা-নিউ এর জন্য সমস্ত ডিফল্ট আকার / ফন্ট / বৈশিষ্ট্যগুলি লগ আউট করেছি )। আমরা যেহেতু অভিগম্যতা মাপ, যা গুরুত্বপূর্ণ জন্য হ্যান্ডলিং জুড়েছেন

সুতরাং আপনাকে যা করতে হবে তা হ'ল একই ধরণের লুক টেবিল তৈরি করা। আমাদের ডিজাইনার আমার জন্য একটি সাধারণ স্প্রেডশিট তৈরি করেছেন:

হরফ আকারের সারণী

লক্ষ্য করুন যে আমরা একটি দম্পতি শৈলী যুক্ত করেছি (ক্যাপশন 3 এবং 4) চয়ন করার জন্য 6 এর পরিবর্তে 8 থাকতে হবে।

তারপরে আপনি এটিকে কোনও বিভাগের মতো সুবিধাজনক কোথাও রেখে দিতে চাইবেন UIFontDescriptor। আপনি চাইবেন যে আপনার পদ্ধতিটি UIFontDescriptorঅ্যাপলের এপিআইয়ের মতো কোনও ফিরে আসুক, যাতে প্রতীকী বৈশিষ্ট্যগুলি ইত্যাদির সাথে সামঞ্জস্য করা এখনও সহজ etc.

আমার বিভাগটি এর মতো দেখাচ্ছে:

UIFontDescriptor + AvenirNext.h

#import <UIKit/UIKit.h>

extern NSString *const ANUIFontTextStyleCaption3;

@interface UIFontDescriptor (AvenirNext)

+(UIFontDescriptor *)preferredAvenirNextFontDescriptorWithTextStyle:(NSString *)style;

@end

UIFontDescriptor + AvenirNext.m

#import "UIFontDescriptor+AvenirNext.h"

NSString *const ANUIFontTextStyleCaption3 = @"ANUIFontTextStyleCaption3";
NSString *const ANUIFontTextStyleCaption4 = @"ANUIFontTextStyleCaption4";

@implementation UIFontDescriptor (AvenirNext)
+(UIFontDescriptor *)preferredAvenirNextFontDescriptorWithTextStyle:(NSString *)style {
    static dispatch_once_t onceToken;
    static NSDictionary *fontSizeTable;
    dispatch_once(&onceToken, ^{
        fontSizeTable = @{
          UIFontTextStyleHeadline: @{
                                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @26,
                                    UIContentSizeCategoryAccessibilityExtraExtraLarge: @25,
                                    UIContentSizeCategoryAccessibilityExtraLarge: @24,
                                    UIContentSizeCategoryAccessibilityLarge: @24,
                                    UIContentSizeCategoryAccessibilityMedium: @23,
                                    UIContentSizeCategoryExtraExtraExtraLarge: @23,
                                    UIContentSizeCategoryExtraExtraLarge: @22,
                                    UIContentSizeCategoryExtraLarge: @21,
                                    UIContentSizeCategoryLarge: @20,
                                    UIContentSizeCategoryMedium: @19,
                                    UIContentSizeCategorySmall: @18,
                                    UIContentSizeCategoryExtraSmall: @17,},

       UIFontTextStyleSubheadline: @{
                                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @24,
                                    UIContentSizeCategoryAccessibilityExtraExtraLarge: @23,
                                    UIContentSizeCategoryAccessibilityExtraLarge: @22,
                                    UIContentSizeCategoryAccessibilityLarge: @22,
                                    UIContentSizeCategoryAccessibilityMedium: @21,
                                    UIContentSizeCategoryExtraExtraExtraLarge: @21,
                                    UIContentSizeCategoryExtraExtraLarge: @20,
                                    UIContentSizeCategoryExtraLarge: @19,
                                    UIContentSizeCategoryLarge: @18,
                                    UIContentSizeCategoryMedium: @17,
                                    UIContentSizeCategorySmall: @16,
                                    UIContentSizeCategoryExtraSmall: @15,},

              UIFontTextStyleBody: @{
                                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @21,
                                    UIContentSizeCategoryAccessibilityExtraExtraLarge: @20,
                                    UIContentSizeCategoryAccessibilityExtraLarge: @19,
                                    UIContentSizeCategoryAccessibilityLarge: @19,
                                    UIContentSizeCategoryAccessibilityMedium: @18,
                                    UIContentSizeCategoryExtraExtraExtraLarge: @18,
                                    UIContentSizeCategoryExtraExtraLarge: @17,
                                    UIContentSizeCategoryExtraLarge: @16,
                                    UIContentSizeCategoryLarge: @15,
                                    UIContentSizeCategoryMedium: @14,
                                    UIContentSizeCategorySmall: @13,
                                    UIContentSizeCategoryExtraSmall: @12,},
          
          UIFontTextStyleCaption1: @{
                                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @19,
                                    UIContentSizeCategoryAccessibilityExtraExtraLarge: @18,
                                    UIContentSizeCategoryAccessibilityExtraLarge: @17,
                                    UIContentSizeCategoryAccessibilityLarge: @17,
                                    UIContentSizeCategoryAccessibilityMedium: @16,
                                    UIContentSizeCategoryExtraExtraExtraLarge: @16,
                                    UIContentSizeCategoryExtraExtraLarge: @16,
                                    UIContentSizeCategoryExtraLarge: @15,
                                    UIContentSizeCategoryLarge: @14,
                                    UIContentSizeCategoryMedium: @13,
                                    UIContentSizeCategorySmall: @12,
                                    UIContentSizeCategoryExtraSmall: @12,},
          
          UIFontTextStyleCaption2: @{
                                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @18,
                                    UIContentSizeCategoryAccessibilityExtraExtraLarge: @17,
                                    UIContentSizeCategoryAccessibilityExtraLarge: @16,
                                    UIContentSizeCategoryAccessibilityLarge: @16,
                                    UIContentSizeCategoryAccessibilityMedium: @15,
                                    UIContentSizeCategoryExtraExtraExtraLarge: @15,
                                    UIContentSizeCategoryExtraExtraLarge: @14,
                                    UIContentSizeCategoryExtraLarge: @14,
                                    UIContentSizeCategoryLarge: @13,
                                    UIContentSizeCategoryMedium: @12,
                                    UIContentSizeCategorySmall: @12,
                                    UIContentSizeCategoryExtraSmall: @11,},
          
        ANUIFontTextStyleCaption3: @{
                                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @17,
                                    UIContentSizeCategoryAccessibilityExtraExtraLarge: @16,
                                    UIContentSizeCategoryAccessibilityExtraLarge: @15,
                                    UIContentSizeCategoryAccessibilityLarge: @15,
                                    UIContentSizeCategoryAccessibilityMedium: @14,
                                    UIContentSizeCategoryExtraExtraExtraLarge: @14,
                                    UIContentSizeCategoryExtraExtraLarge: @13,
                                    UIContentSizeCategoryExtraLarge: @12,
                                    UIContentSizeCategoryLarge: @12,
                                    UIContentSizeCategoryMedium: @12,
                                    UIContentSizeCategorySmall: @11,
                                    UIContentSizeCategoryExtraSmall: @10,},

          UIFontTextStyleFootnote: @{
                                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @16,
                                    UIContentSizeCategoryAccessibilityExtraExtraLarge: @15,
                                    UIContentSizeCategoryAccessibilityExtraLarge: @14,
                                    UIContentSizeCategoryAccessibilityLarge: @14,
                                    UIContentSizeCategoryAccessibilityMedium: @13,
                                    UIContentSizeCategoryExtraExtraExtraLarge: @13,
                                    UIContentSizeCategoryExtraExtraLarge: @12,
                                    UIContentSizeCategoryExtraLarge: @12,
                                    UIContentSizeCategoryLarge: @11,
                                    UIContentSizeCategoryMedium: @11,
                                    UIContentSizeCategorySmall: @10,
                                    UIContentSizeCategoryExtraSmall: @10,},

          ANUIFontTextStyleCaption4: @{
                                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @15,
                                    UIContentSizeCategoryAccessibilityExtraExtraLarge: @14,
                                    UIContentSizeCategoryAccessibilityExtraLarge: @13,
                                    UIContentSizeCategoryAccessibilityLarge: @13,
                                    UIContentSizeCategoryAccessibilityMedium: @12,
                                    UIContentSizeCategoryExtraExtraExtraLarge: @12,
                                    UIContentSizeCategoryExtraExtraLarge: @11,
                                    UIContentSizeCategoryExtraLarge: @11,
                                    UIContentSizeCategoryLarge: @10,
                                    UIContentSizeCategoryMedium: @10,
                                    UIContentSizeCategorySmall: @9,
                                    UIContentSizeCategoryExtraSmall: @9,},
        };
    });
    
    
    NSString *contentSize = [UIApplication sharedApplication].preferredContentSizeCategory;
    return [UIFontDescriptor fontDescriptorWithName:[self preferredFontName] size:((NSNumber *)fontSizeTable[style][contentSize]).floatValue];
}
+(UIFontDescriptor *)preferredAvenirNextDemiBoldFontDescriptorWithTextStyle:(NSString *)style {
    return [[self preferredAvenirNextFontDescriptorWithTextStyle:style] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
}

+(UIFontDescriptor *)preferredAvenirNextBoldFontDescriptorWithTextStyle:(NSString *)style {
    return [UIFontDescriptor fontDescriptorWithName:[self preferredBoldFontName] size:[self preferredAvenirNextFontDescriptorWithTextStyle:style].pointSize];
}

+(NSString *)preferredFontName {
    return @"AvenirNext-Medium";
}
+(NSString *)preferredBoldFontName {
    return @"AvenirNext-Bold";
}

@end

আমরা একই বেস হরফ ব্যবহার করতে AvenirNext-Mediumএবং তারপরে সাহসী এবং প্রতীকী বৈশিষ্ট্যের মাধ্যমে ব্যবহার করতে বেছে নিয়েছি , তবে আপনি পাগল হতে পারেন এবং আপনার ফন্টে আপনার লুকিং টেবিলের অংশ হিসাবে বিভিন্ন ওজনের বৈকল্পিকগুলি নির্দিষ্ট করতে চাইলে আপনিও পছন্দ করতে পারেন AvenirNext-ExtraBold

এখানেই শেষ এটা পেতে ওখানে যাও! আমরা এটি এর মতো ব্যবহার করি:

[UIFont fontWithDescriptor:[UIFontDescriptor preferredAvenirNextFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size: 0]

6
চমৎকার সমাধান, কিন্তু আপনি অভিগম্যতা ধ্রুবক অনুপস্থিত: UIContentSizeCategoryAccessibilityMedium, UIContentSizeCategoryAccessibilityLarge, ইত্যাদি
বেন জ্যাকসন

আহ আকর্ষণীয়। @ বেনজ্যাকসনকে জেনে রাখা ভাল। ধন্যবাদ!
বব স্প্রিন

4
কেন সম্প্রসারিত নয় UIFont, যাতে আপনি শুধু ব্যবহার করতে পারেন: [UIFont preferredAvenirFontForTextStyle:UIFontTextStyleHeadline]? আপনি নীচে দেওয়া উদাহরণে আকার অপ্রয়োজনীয়?
চৌকস

4
@richarddas কেবল অ্যাপলের ধাঁচের সাথে রাখতে। 0 এর আকারকে উপেক্ষা করা হয় এবং বর্ণনাকারীর কাছ থেকে কেবল সঠিক আকারের মধ্য দিয়ে যায়।
বব স্প্রিন

4
আইওএস 8.4 হিসাবে অ্যাপল ফন্টের আকারকে
ক্লাস

15

আমি সুইফটে এটিই করি। আমি এটি পছন্দ করি কারণ এটি আরও সাধারণ, এটির জন্য কেবল একটি টেবিল প্রয়োজন এবং এটি কোনও ফন্টের সাথে ভালভাবে কাজ করা উচিত। প্রথমে আমি একটি জেনারেলাইজড গুণক (একটি গেটারে) লিখেছিলাম।

var fontSizeMultiplier : CGFloat {
    get {
        switch UIApplication.sharedApplication().preferredContentSizeCategory {
        case UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: return 23 / 16
        case UIContentSizeCategoryAccessibilityExtraExtraLarge: return 22 / 16
        case UIContentSizeCategoryAccessibilityExtraLarge: return 21 / 16
        case UIContentSizeCategoryAccessibilityLarge: return 20 / 16
        case UIContentSizeCategoryAccessibilityMedium: return 19 / 16
        case UIContentSizeCategoryExtraExtraExtraLarge: return 19 / 16
        case UIContentSizeCategoryExtraExtraLarge: return 18 / 16
        case UIContentSizeCategoryExtraLarge: return 17 / 16
        case UIContentSizeCategoryLarge: return 1.0
        case UIContentSizeCategoryMedium: return 15 / 16
        case UIContentSizeCategorySmall: return 14 / 16
        case UIContentSizeCategoryExtraSmall: return 13 / 16
        default: return 1.0
        }
    }
}

তারপরে আমি হরফটি আপডেট করে (যেমন পর্যবেক্ষক হিসাবে) এর UIFontDescriptorমতো ব্যবহার করে :

textView.font = UIFont(descriptor: fontDescriptor!, size: fontDescriptor!.pointSize * fontSizeMultiplier)

এটি সেটিংস হিসাবে কাজ করবে না আপনি যখনই সেটিংসে আকার আপডেট করবেন ততবার পয়েন্টসাইজ দ্রুত বৃদ্ধি পাবে। আপনি যদি কোনও ডিফল্ট ফন্টের আকার সেট করে থাকেন তবে আপনি এটিকে একটি বেস হিসাবে ব্যবহার করতে পারেন এবং এটি ফন্টসাইজ মাল্টিপ্লায়ার দ্বারা গুণ করতে পারেন।
তেজেসিস

@ টেজেস - এটি ভাল কাজ করে। আমি বছরের পর বছর ধরে এটি ব্যবহার করে আসছি। এটি যেহেতু আক্ষরিক মানগুলি ফিরিয়ে দিচ্ছে আপনি সেটিংস পরিবর্তন করার সময় আপনি কীভাবে এটি বাড়বে তা আপনি দেখতে পাচ্ছেন না।
বিল ওয়েইনম্যান

12

আইওএসে ১১ টি UIFontMetricsক্লাস চালু হয়েছিল। আপনি আগ্রহী পাঠ্য শৈলীর জন্য একটি ফন্টমেট্রিক্স অবজেক্ট তৈরি করুন Then তারপরে স্ট্যান্ডার্ড ডায়নামিক টাইপের আকারের জন্য মাপের যে কোনও ফন্ট চয়ন করুন। এবং তারপরে আপনি ফন্টমেট্রিক্স অবজেক্টটিকে ব্যবহারকারীর বর্তমান সেটিংসের ভিত্তিতে সেই ফন্টটি স্কেল করতে বলতে পারেন।

let bodyMetrics = UIFontMetrics(forTextStyle: .body)
let standardFont = ... // any font you want, for standard type size
let font = bodyMetrics.scaledFont(for: standardFont)

8

@ باب স্প্রাইনের কোডটি দ্রুত সঙ্গে পুনরায় লিখেছেন:

import UIKit

extension UIFontDescriptor {

    private struct SubStruct {
        static var preferredFontName: NSString = "OEMeodedPashutPro-Regular"
    }

    class func preferredDescriptor(textStyle: NSString) -> UIFontDescriptor {
        struct Static {
            static var onceToken : dispatch_once_t = 0
            static var fontSizeTable : NSDictionary = NSDictionary()
        }

        dispatch_once(&Static.onceToken) {
            Static.fontSizeTable = [
                UIFontTextStyleHeadline: [
                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 26,
                    UIContentSizeCategoryAccessibilityExtraExtraLarge: 25,
                    UIContentSizeCategoryAccessibilityExtraLarge: 24,
                    UIContentSizeCategoryAccessibilityLarge: 24,
                    UIContentSizeCategoryAccessibilityMedium: 23,
                    UIContentSizeCategoryExtraExtraExtraLarge: 23,
                    UIContentSizeCategoryExtraExtraLarge: 22,
                    UIContentSizeCategoryExtraLarge: 21,
                    UIContentSizeCategoryLarge: 20,
                    UIContentSizeCategoryMedium: 19,
                    UIContentSizeCategorySmall: 18,
                    UIContentSizeCategoryExtraSmall: 17
                ],
                UIFontTextStyleSubheadline: [
                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 24,
                    UIContentSizeCategoryAccessibilityExtraExtraLarge: 23,
                    UIContentSizeCategoryAccessibilityExtraLarge: 22,
                    UIContentSizeCategoryAccessibilityLarge: 22,
                    UIContentSizeCategoryAccessibilityMedium: 21,
                    UIContentSizeCategoryExtraExtraExtraLarge: 21,
                    UIContentSizeCategoryExtraExtraLarge: 20,
                    UIContentSizeCategoryExtraLarge: 19,
                    UIContentSizeCategoryLarge: 18,
                    UIContentSizeCategoryMedium: 17,
                    UIContentSizeCategorySmall: 16,
                    UIContentSizeCategoryExtraSmall: 15
                ],
                UIFontTextStyleBody: [
                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 21,
                    UIContentSizeCategoryAccessibilityExtraExtraLarge: 20,
                    UIContentSizeCategoryAccessibilityExtraLarge: 19,
                    UIContentSizeCategoryAccessibilityLarge: 19,
                    UIContentSizeCategoryAccessibilityMedium: 18,
                    UIContentSizeCategoryExtraExtraExtraLarge: 18,
                    UIContentSizeCategoryExtraExtraLarge: 17,
                    UIContentSizeCategoryExtraLarge: 16,
                    UIContentSizeCategoryLarge: 15,
                    UIContentSizeCategoryMedium: 14,
                    UIContentSizeCategorySmall: 13,
                    UIContentSizeCategoryExtraSmall: 12
                ],
                UIFontTextStyleCaption1: [
                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 19,
                    UIContentSizeCategoryAccessibilityExtraExtraLarge: 18,
                    UIContentSizeCategoryAccessibilityExtraLarge: 17,
                    UIContentSizeCategoryAccessibilityLarge: 17,
                    UIContentSizeCategoryAccessibilityMedium: 16,
                    UIContentSizeCategoryExtraExtraExtraLarge: 16,
                    UIContentSizeCategoryExtraExtraLarge: 16,
                    UIContentSizeCategoryExtraLarge: 15,
                    UIContentSizeCategoryLarge: 14,
                    UIContentSizeCategoryMedium: 13,
                    UIContentSizeCategorySmall: 12,
                    UIContentSizeCategoryExtraSmall: 12
                ],
                UIFontTextStyleCaption2: [
                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 18,
                    UIContentSizeCategoryAccessibilityExtraExtraLarge: 17,
                    UIContentSizeCategoryAccessibilityExtraLarge: 16,
                    UIContentSizeCategoryAccessibilityLarge: 16,
                    UIContentSizeCategoryAccessibilityMedium: 15,
                    UIContentSizeCategoryExtraExtraExtraLarge: 15,
                    UIContentSizeCategoryExtraExtraLarge: 14,
                    UIContentSizeCategoryExtraLarge: 14,
                    UIContentSizeCategoryLarge: 13,
                    UIContentSizeCategoryMedium: 12,
                    UIContentSizeCategorySmall: 12,
                    UIContentSizeCategoryExtraSmall: 11
                ],
                UIFontTextStyleFootnote: [
                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 16,
                    UIContentSizeCategoryAccessibilityExtraExtraLarge: 15,
                    UIContentSizeCategoryAccessibilityExtraLarge: 14,
                    UIContentSizeCategoryAccessibilityLarge: 14,
                    UIContentSizeCategoryAccessibilityMedium: 13,
                    UIContentSizeCategoryExtraExtraExtraLarge: 13,
                    UIContentSizeCategoryExtraExtraLarge: 12,
                    UIContentSizeCategoryExtraLarge: 12,
                    UIContentSizeCategoryLarge: 11,
                    UIContentSizeCategoryMedium: 11,
                    UIContentSizeCategorySmall: 10,
                    UIContentSizeCategoryExtraSmall: 10
                ],
            ]
        }

        let contentSize = UIApplication.sharedApplication().preferredContentSizeCategory

        let style = Static.fontSizeTable[textStyle] as NSDictionary

        return UIFontDescriptor(name: SubStruct.preferredFontName, size: CGFloat((style[contentSize] as NSNumber).floatValue))
    }

}

ব্যবহার:

UIFont(descriptor: UIFontDescriptor.preferredDescriptor(UIFontTextStyleBody), size: 0)

4
এক্সকোড 7.2 আমাকে শেষ দুটি লাইনটি এতে পরিবর্তন করেছে: let style = Static.fontSizeTable[textStyle] as! NSDictionaryএবংreturn UIFontDescriptor(name: SubStruct.preferredFontName as String, size: CGFloat((style[contentSize] as! NSNumber).floatValue))
কোইন

স্টোরিবোর্ডে পছন্দের ফন্টটি দেখায় এমন কিছু করতে পারলে সত্যিই দুর্দান্ত হবে। সম্ভবত পাঠ্য উপাদান সাবক্লাসিং দ্বারা।
অ্যারন ব্র্যাচার 12

7

এটা চেষ্টা কর:

UIFontDescriptor *userHeadLineFont = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline];
CGFloat userHeadLineFontSize = [userHeadLineFont pointSize];
myFont = [UIFont fontWithName:@"Baskerville" size:userHeadLineFontSize];

তবে মনে রাখবেন যে এই কোডটি কেবল একটি আনুমানিক (ডায়নামিক টাইপ কেবলমাত্র স্কেল ফন্টের আকারের চেয়ে অনেক বেশি কাজ করে)।


আপনি প্যারানথেসিস বিস্তারিত বলতে পারেন? স্কেলিংয়ের চেয়ে আরও বেশি কী আমার বিবেচনায় নেওয়া উচিত?
hfossli

4
"ডায়নামিক টাইপ" এবং সত্যই ব্যবহৃত ফন্টের মধ্যে একটি ম্যাপিং রয়েছে। উদাহরণস্বরূপ ছোট্ট ফন্টটি সাহসী হয়ে উঠতে পারে। আমি সঠিক ম্যাপিং জানি না। এই নিবন্ধে শেষ চিত্রটি ("ডায়নামিক ধরণের অপটিক্যাল স্কেলিং") দেখুন: আরও ভালভাবে বুঝতে ফায়ারবলেড.আর / লিঙ্কড / ২০১ked / 07/8 / আইওস-7- টাইপ করুন ।
ভালফার

4
এই এক অনুমোদিত সঠিক উত্তর হিসাবে একই, কিন্তু লাইনের সংখ্যার মধ্যে পার্থক্য। দুর্দান্ত সমাধান। SWIFT স্ট্যাকওভারফ্লোতে এটি
ভ্যানিয়া

মন্তব্যগুলিতে @ ওয়ালফার দ্বারা উল্লিখিত নিবন্ধটির একটি কার্যকারী লিঙ্ক এখানে রয়েছে: হেলভেটিকা ​​ছাড়িয়ে: আইওএস-এ ফন্টের পিছনে রিয়েল স্টোরি 7
0xced

6

@ বিল-ওয়েইনম্যানের পদ্ধতির অনুরূপ , আমি স্কেলগুলি নিয়েছিলাম এবং এটিকে এমন একটি ফাংশন হিসাবে ছড়িয়ে দিয়েছি যা প্রদত্ত ফন্টের আকারের উপর নির্ভর করে না 16।

/// The font scale for a given font size.
///
/// - seealso: [Source](https://stackoverflow.com/a/33114525/3643020)
///
/// - Parameter fontSize: The font size.
/// - Returns: The font scale
public func fontScale(for fontSize: CGFloat) -> CGFloat {
    switch UIApplication.shared.preferredContentSizeCategory {
    case UIContentSizeCategory.accessibilityExtraExtraExtraLarge:    return (fontSize + 8) / fontSize
    case UIContentSizeCategory.accessibilityExtraExtraLarge:         return (fontSize + 7) / fontSize
    case UIContentSizeCategory.accessibilityExtraLarge:              return (fontSize + 6) / fontSize
    case UIContentSizeCategory.accessibilityLarge:                   return (fontSize + 5) / fontSize
    case UIContentSizeCategory.accessibilityMedium:                  return (fontSize + 4) / fontSize
    case UIContentSizeCategory.extraExtraExtraLarge:                 return (fontSize + 3) / fontSize
    case UIContentSizeCategory.extraExtraLarge:                      return (fontSize + 2) / fontSize
    case UIContentSizeCategory.extraLarge:                           return (fontSize + 1) / fontSize
    case UIContentSizeCategory.large:                                return 1.0
    case UIContentSizeCategory.medium:                               return (fontSize - 1) / fontSize
    case UIContentSizeCategory.small:                                return (fontSize - 2) / fontSize
    case UIContentSizeCategory.extraSmall:                           return (fontSize - 3) / fontSize
    default:
        return 1.0
    }
}

এরপরে এটি কাস্টম ফন্টগুলির সাথে ব্যবহার করা যেতে পারে:

/// Light font of specified size.
///
/// - Parameter size: Font size.
/// - Returns: Light font of specified size.
func lightFont(ofSize size: CGFloat) -> UIFont {
    let scaledSize = size * fontScale(for: size)

    return UIFont(name: "HelveticaNeueLTStd-Lt", size: scaledSize)!
}

আপনি যদি এমন পর্যায়ে থাকেন যেখানে আপনি সবকিছু ঠিকঠাক করতে চান না তবে এটি খারাপ নয়। এছাড়াও যদি আপনার কাস্টম ফন্টটি বরং ছোট হয় এবং ডিফল্টরূপে কিছু স্কেলিংয়ের প্রয়োজন হয়।
জানব্রিংকার

এফওয়াইআই - আমার পদ্ধতির হরফ আকারের উপর নির্ভর করে না। এটি একটি অনুপাতের ভিত্তিতে একটি মান প্রদান করে। এটি কাস্টম / স্কেলড ফন্টগুলির সাথে সূক্ষ্মভাবে কাজ করে।
বিল ওয়েইনম্যান

3

আইওএস 11 এ আপনি ব্যবহার করতে পারেন:

var customFont = UIFont.systemFont(ofSize: 17.0)
if #available(iOS 11.0, *) {
    customFont = UIFontMetrics.default.scaledFont(for: customFont)
}
// use customFont...

ডায়নামিক টাইপ ডাব্লুডব্লিউডিসি 2017 - সেশন 245 - আইওএস সময় 8:34 সহ বিল্ডিং অ্যাপ্লিকেশনগুলিও দেখুন ।


2

সুইট ২.১-৩.০ কোড @ স্মিডনকি এর @bbb স্প্রাইনের কোডের ভিত্তিতে। @ ক্লাস থেকে অ্যাপল আকারের সাথে আপডেটও হয়েছে

import UIKit

extension UIFontDescriptor {

    private struct SubStruct {
        static var preferredFontName: String = "Roboto-Light"
    }

    class func preferredDescriptor(textStyle: NSString) -> UIFontDescriptor {
        struct Static {
            static var onceToken : dispatch_once_t = 0
            static var fontSizeTable : NSDictionary = NSDictionary()
        }

        dispatch_once(&Static.onceToken) {
            Static.fontSizeTable = [
                UIFontTextStyleHeadline: [
                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 23,
                    UIContentSizeCategoryAccessibilityExtraExtraLarge: 23,
                    UIContentSizeCategoryAccessibilityExtraLarge: 23,
                    UIContentSizeCategoryAccessibilityLarge: 23,
                    UIContentSizeCategoryAccessibilityMedium: 23,
                    UIContentSizeCategoryExtraExtraExtraLarge: 23,
                    UIContentSizeCategoryExtraExtraLarge: 21,
                    UIContentSizeCategoryExtraLarge: 19,
                    UIContentSizeCategoryLarge: 17,
                    UIContentSizeCategoryMedium: 16,
                    UIContentSizeCategorySmall: 15,
                    UIContentSizeCategoryExtraSmall: 14
                ],
                UIFontTextStyleSubheadline: [
                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 21,
                    UIContentSizeCategoryAccessibilityExtraExtraLarge: 21,
                    UIContentSizeCategoryAccessibilityExtraLarge: 21,
                    UIContentSizeCategoryAccessibilityLarge: 21,
                    UIContentSizeCategoryAccessibilityMedium: 21,
                    UIContentSizeCategoryExtraExtraExtraLarge: 21,
                    UIContentSizeCategoryExtraExtraLarge: 19,
                    UIContentSizeCategoryExtraLarge: 17,
                    UIContentSizeCategoryLarge: 15,
                    UIContentSizeCategoryMedium: 14,
                    UIContentSizeCategorySmall: 13,
                    UIContentSizeCategoryExtraSmall: 12
                ],
                UIFontTextStyleBody: [
                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 53,
                    UIContentSizeCategoryAccessibilityExtraExtraLarge: 47,
                    UIContentSizeCategoryAccessibilityExtraLarge: 40,
                    UIContentSizeCategoryAccessibilityLarge: 33,
                    UIContentSizeCategoryAccessibilityMedium: 28,
                    UIContentSizeCategoryExtraExtraExtraLarge: 23,
                    UIContentSizeCategoryExtraExtraLarge: 21,
                    UIContentSizeCategoryExtraLarge: 19,
                    UIContentSizeCategoryLarge: 17,
                    UIContentSizeCategoryMedium: 16,
                    UIContentSizeCategorySmall: 15,
                    UIContentSizeCategoryExtraSmall: 14
                ],
                UIFontTextStyleCaption1: [
                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 18,
                    UIContentSizeCategoryAccessibilityExtraExtraLarge: 18,
                    UIContentSizeCategoryAccessibilityExtraLarge: 18,
                    UIContentSizeCategoryAccessibilityLarge: 18,
                    UIContentSizeCategoryAccessibilityMedium: 18,
                    UIContentSizeCategoryExtraExtraExtraLarge: 18,
                    UIContentSizeCategoryExtraExtraLarge: 16,
                    UIContentSizeCategoryExtraLarge: 14,
                    UIContentSizeCategoryLarge: 12,
                    UIContentSizeCategoryMedium: 11,
                    UIContentSizeCategorySmall: 11,
                    UIContentSizeCategoryExtraSmall: 11
                ],
                UIFontTextStyleCaption2: [
                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 17,
                    UIContentSizeCategoryAccessibilityExtraExtraLarge: 17,
                    UIContentSizeCategoryAccessibilityExtraLarge: 17,
                    UIContentSizeCategoryAccessibilityLarge: 17,
                    UIContentSizeCategoryAccessibilityMedium: 17,
                    UIContentSizeCategoryExtraExtraExtraLarge: 17,
                    UIContentSizeCategoryExtraExtraLarge: 15,
                    UIContentSizeCategoryExtraLarge: 13,
                    UIContentSizeCategoryLarge: 11,
                    UIContentSizeCategoryMedium: 11,
                    UIContentSizeCategorySmall: 11,
                    UIContentSizeCategoryExtraSmall: 11
                ],
                UIFontTextStyleFootnote: [
                    UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 19,
                    UIContentSizeCategoryAccessibilityExtraExtraLarge: 19,
                    UIContentSizeCategoryAccessibilityExtraLarge: 19,
                    UIContentSizeCategoryAccessibilityLarge: 19,
                    UIContentSizeCategoryAccessibilityMedium: 19,
                    UIContentSizeCategoryExtraExtraExtraLarge: 19,
                    UIContentSizeCategoryExtraExtraLarge: 17,
                    UIContentSizeCategoryExtraLarge: 15,
                    UIContentSizeCategoryLarge: 13,
                    UIContentSizeCategoryMedium: 12,
                    UIContentSizeCategorySmall: 12,
                    UIContentSizeCategoryExtraSmall: 12
                ],
            ]
        }

        let contentSize = UIApplication.sharedApplication().preferredContentSizeCategory
        let style = Static.fontSizeTable[textStyle] as! NSDictionary
        return UIFontDescriptor(name: SubStruct.preferredFontName, size: CGFloat((style[contentSize] as! NSNumber).floatValue))
    }

}

আপনার সমাধান সহ সুইফ্ট 3 এ ত্রুটি:'dispatch_once_t' is unavailable in Swift: Use lazily initialized globals instead
থেক্স্যান্ডে

2

সুইফট 3 এ আমার এখানে @ গোবের উত্তরটি দেখুন:

extension UIFontDescriptor {

@nonobjc static var fontSizeTable: [UIFontTextStyle : [UIContentSizeCategory : CGFloat]] = {
    return [
        .headline: [
            .accessibilityExtraExtraExtraLarge: 23,
            .accessibilityExtraExtraLarge: 23,
            .accessibilityExtraLarge: 23,
            .accessibilityLarge: 23,
            .accessibilityMedium: 23,
            .extraExtraExtraLarge: 23,
            .extraExtraLarge: 21,
            .extraLarge: 19,
            .large: 17,
            .medium: 16,
            .small: 15,
            .extraSmall: 14],
        .subheadline: [
            .accessibilityExtraExtraExtraLarge: 21,
            .accessibilityExtraExtraLarge: 21,
            .accessibilityExtraLarge: 21,
            .accessibilityLarge: 21,
            .accessibilityMedium: 21,
            .extraExtraExtraLarge: 21,
            .extraExtraLarge: 19,
            .extraLarge: 17,
            .large: 15,
            .medium: 14,
            .small: 13,
            .extraSmall: 12],
        .body: [
            .accessibilityExtraExtraExtraLarge: 53,
            .accessibilityExtraExtraLarge: 47,
            .accessibilityExtraLarge: 40,
            .accessibilityLarge: 33,
            .accessibilityMedium: 28,
            .extraExtraExtraLarge: 23,
            .extraExtraLarge: 21,
            .extraLarge: 19,
            .large: 17,
            .medium: 16,
            .small: 15,
            .extraSmall: 14],
        .caption1: [
            .accessibilityExtraExtraExtraLarge: 18,
            .accessibilityExtraExtraLarge: 18,
            .accessibilityExtraLarge: 18,
            .accessibilityLarge: 18,
            .accessibilityMedium: 18,
            .extraExtraExtraLarge: 18,
            .extraExtraLarge: 16,
            .extraLarge: 14,
            .large: 12,
            .medium: 11,
            .small: 11,
            .extraSmall: 11],
        .caption2: [
            .accessibilityExtraExtraExtraLarge: 17,
            .accessibilityExtraExtraLarge: 17,
            .accessibilityExtraLarge: 17,
            .accessibilityLarge: 17,
            .accessibilityMedium: 17,
            .extraExtraExtraLarge: 17,
            .extraExtraLarge: 15,
            .extraLarge: 13,
            .large: 11,
            .medium: 11,
            .small: 11,
            .extraSmall: 11],
        .footnote: [
            .accessibilityExtraExtraExtraLarge: 19,
            .accessibilityExtraExtraLarge: 19,
            .accessibilityExtraLarge: 19,
            .accessibilityLarge: 19,
            .accessibilityMedium: 19,
            .extraExtraExtraLarge: 19,
            .extraExtraLarge: 17,
            .extraLarge: 15,
            .large: 13,
            .medium: 12,
            .small: 12,
            .extraSmall: 12],
    ]
}()

class func currentPreferredSize(textStyle: UIFontTextStyle = .body) -> CGFloat {
    let contentSize = UIApplication.shared.preferredContentSizeCategory
    guard let style = fontSizeTable[textStyle], let fontSize = style[contentSize] else { return 17 }
    return fontSize
}

class func preferredFontDescriptor(fontName: String = "SnellRoundhand", textStyle: UIFontTextStyle = .body) -> UIFontDescriptor {
    return UIFontDescriptor(name: fontName, size: currentPreferredSize())
}
}

Swift5 সংস্করণে যোগ করা হয়েছে stackoverflow.com/questions/41798080/...
marika.daboja

1

এইভাবে আমি একটি প্রিফারডফর্টফরেক্সটেক্সটাইল স্টোনটির ফন্টটি আপডেট করব:

UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
UIFontDescriptor *fontDesc = [font fontDescriptor];
fontDesc = [fontDesc fontDescriptorByAddingAttributes:@{UIFontDescriptorNameAttribute : @"Helvetica",
                                                        UIFontDescriptorSizeAttribute : @16}];

font = [UIFont fontWithDescriptor:fontDesc
                             size:[fontDesc pointSize]];

1

কাস্টম ফন্টগুলিকে একীভূত করতে এবং ডায়নামিক টাইপ আকারের পরিবর্তনগুলি মোকাবেলায় সহায়তা করার জন্য কেবল লাফিয়ে উঠে বলতে চেয়েছিলেন there একে বলা হয়, সহায়কভাবে, ফন্ট ( https://github.com/adamyanalunas/Font ) এবং একটি যাদু সমাধানের পরিবর্তে এটি বয়লারপ্লেট অপসারণ করার সময় প্রতিটি কাস্টম ফন্ট হ্যান্ডল করার জন্য একটি কাঠামো স্থাপন করে।

nb আমি এই লিল লাইব্রেরির লেখক এবং আমার মনে হয় এটি খুব ঝরঝরে।


0

আইওএস 11 থেকে শুরু করে আপনি ভিজ্যুয়াল এডিটারে কনফিগার করা কাস্টম ফন্টগুলি প্রোগ্রামগতভাবে সমন্বয় করতে পারেন:

  1. ভিজ্যুয়াল এডিটর ব্যবহার করে আপনার কাস্টম ফন্টটি কনফিগার করুন
  2. ভিডলিড পদ্ধতিতে ফন্টের আকারটি সামঞ্জস্য করুন:
@IBOutlet weak var leftLangLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    leftLangLabel.font = UIFontMetrics.default.scaledFont(for: leftLangLabel.font)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.