Hyphenation in native iOS app

前端 未结 3 1608
广开言路
广开言路 2020-12-25 08:40

How can I activate automatic hyphenation in iOS?

I have tried to set the hyphenation factor to 1 in the attributed text options of an UILabel, however I don\'t get

3条回答
  •  没有蜡笔的小新
    2020-12-25 08:42

    CoreText or TextKit

    You need to add "soft hyphenation" to the string. These are "-" which is not visible when rendered, but instead merely queues for CoreText or UITextKit to know how to break up words.

    The soft hyphen sign which you should place in the text is:

    unichar const kTextDrawingSoftHyphenUniChar = 0x00AD;
    NSString * const kTextDrawingSoftHyphenToken = @"­"; // NOTE: UTF-8 soft hyphen!
    

    Example code

    NSString *string = @"accessibility tests and frameworks checking";
    NSLocale *locale = [NSLocale localeWithLocaleIdentifier:@"en_US"];
    NSString *hyphenatedString = [string softHyphenatedStringWithLocale:locale error:nil];
    NSLog(@"%@", hyphenatedString);
    

    Outputs ac-ces-si-bil-i-ty tests and frame-works check-ing


    NSString+SoftHyphenation.h

    typedef enum {
        NSStringSoftHyphenationErrorNotAvailableForLocale
    } NSStringSoftHyphenationError;
    
    extern NSString * const NSStringSoftHyphenationErrorDomain;
    
    @interface NSString (SoftHyphenation)
    
    - (NSString *)softHyphenatedStringWithLocale:(NSLocale *)locale error:(out NSError **)error;
    
    @end
    

    NSString+SoftHyphenation.m

    NSString * const NSStringSoftHyphenationErrorDomain = @"NSStringSoftHyphenationErrorDomain";
    
    @implementation NSString (SoftHyphenation)
    
    - (NSError *)hyphen_createOnlyError
    {
        NSDictionary *userInfo = @{
                                   NSLocalizedDescriptionKey: @"Hyphenation is not available for given locale",
                                   NSLocalizedFailureReasonErrorKey: @"Hyphenation is not available for given locale",
                                   NSLocalizedRecoverySuggestionErrorKey: @"You could try using a different locale even though it might not be 100% correct"
                                   };
        return [NSError errorWithDomain:NSStringSoftHyphenationErrorDomain code:NSStringSoftHyphenationErrorNotAvailableForLocale userInfo:userInfo];
    }
    
    - (NSString *)softHyphenatedStringWithLocale:(NSLocale *)locale error:(out NSError **)error
    {
        CFLocaleRef localeRef = (__bridge CFLocaleRef)(locale);
        if(!CFStringIsHyphenationAvailableForLocale(localeRef))
        {
            if(error != NULL)
            {
                *error = [self hyphen_createOnlyError];
            }
            return [self copy];
        }
        else
        {
            NSMutableString *string = [self mutableCopy];
            unsigned char hyphenationLocations[string.length];
            memset(hyphenationLocations, 0, string.length);
            CFRange range = CFRangeMake(0, string.length);
    
            for(int i = 0; i < string.length; i++)
            {
                CFIndex location = CFStringGetHyphenationLocationBeforeIndex((CFStringRef)string,
                                                                             i,
                                                                             range,
                                                                             0,
                                                                             localeRef,
                                                                             NULL);
    
                if(location >= 0 && location < string.length)
                {
                    hyphenationLocations[location] = 1;
                }
            }
    
            for(int i = string.length - 1; i > 0; i--)
            {
                if(hyphenationLocations[i])
                {
                    [string insertString:@"-" atIndex:i];
                }
            }
    
            if(error != NULL) { *error = nil;}
    
            return string;
        }
    }
    
    @end
    

提交回复
热议问题