Библиотека переносов не работает с iOS 5 - PullRequest
1 голос
/ 20 ноября 2011

Я только что попробовал библиотеку дефисов Tupil.

Это было упомянуто здесь http://blog.tupil.com/adding-hyphenation-to-nsstring/.

Но, хотя она прекрасно работает под iOS 4.3, я не смог заставить ее работать с iOS5.

Могу ли я использовать какие-либо другие фреймворки?Я слышал о CoreText, но не знаю, с чего начать.

Заранее спасибо, Мартин

Ответы [ 2 ]

1 голос
/ 07 июня 2013

Я понимаю, что прошло несколько лет, но я только что обнаружил, что есть базовая функция Foundation, которая предлагает точки переноса: CFStringGetHyphenationLocationBeforeIndex .Это работает только для нескольких языков, но похоже, что это может быть действительно полезно для проблемы узкой метки.

Обновление:

Вот пример кода.Это программа CLI, которая показывает, где переносить слово:

#include <Cocoa/Cocoa.h>


int main(int ac, char *av[])
{
    @autoreleasepool {

    if(ac < 2) {
        fprintf(stderr, "usage:  hyph  word\n");
        exit(1);
    }
    NSString *word = [NSString stringWithUTF8String: av[1]];
    unsigned char hyspots[word.length];
    memset(hyspots, 0, word.length);
    CFRange range = CFRangeMake(0, word.length);
    CFLocaleRef locale = CFLocaleCreate(NULL, CFSTR("en_US"));
    for(int i = 0; i < word.length; i++) {
        int x = CFStringGetHyphenationLocationBeforeIndex(
                    (CFStringRef) word, i, range,
                    0, locale, NULL);
        if(x >= 0 && x < word.length)
            hyspots[x] = 1;
    }
    for(int i = 0; i < word.length; i++) {
        if(hyspots[i]) putchar('-');
        printf("%s", [[word substringWithRange: NSMakeRange(i, 1)] UTF8String]);
    }
    putchar('\n');

    }

    exit(0);
}

Вот как это выглядит при сборке и запуске:

$ cc -o hyph hyph.m -framework Cocoa
$ hyph accessibility
ac-ces-si-bil-i-ty
$ hyph hypothesis
hy-poth-e-sis

Эти переносы точно соответствуют словарю OS X,Я использую это для решения проблемы узкой метки в iOS, и она хорошо работает для меня.

0 голосов
/ 08 ноября 2013

Я написал ответ Джеффри на основе категории для добавления «мягких переносов» к любой строке.Это «-», которое не отображается при рендеринге, но вместо этого просто ставит в очередь для CoreText или UITextKit знать, как разбить слова.

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

Выходы ac-ces-si-bil-i-ty tests and frame-works check-ing


NSString + SoftHyphenation.h

typedef enum {
    NSStringSoftHyphenationErrorNotAvailableForLocale
} NSStringSoftHyphenationError;

extern NSString * const NSStringSoftHyphenationErrorDomain;
extern NSString * const NSStringSoftHyphenationToken;

@interface NSString (SoftHyphenation)

- (BOOL)canSoftHyphenateStringWithLocale:(NSLocale *)locale;
- (NSString *)softHyphenatedStringWithLocale:(NSLocale *)locale error:(out NSError **)error;

@end

NSString + SoftHyphenation.m

#import "NSString+SoftHyphenation.h"

NSString * const NSStringSoftHyphenationErrorDomain = @"NSStringSoftHyphenationErrorDomain";
NSString * const NSStringSoftHyphenationToken = @"­"; // NOTE: UTF-8 soft hyphen!

@implementation NSString (SoftHyphenation)

- (BOOL)canSoftHyphenateStringWithLocale:(NSLocale *)locale
{
    CFLocaleRef localeRef = (__bridge CFLocaleRef)(locale);
    return CFStringIsHyphenationAvailableForLocale(localeRef);
}

- (NSString *)softHyphenatedStringWithLocale:(NSLocale *)locale error:(out NSError **)error
{
    if(![self canSoftHyphenateStringWithLocale:locale])
    {
        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);
        CFLocaleRef localeRef = (__bridge CFLocaleRef)(locale);

        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:NSStringSoftHyphenationToken atIndex:i];
            }
        }

        if(error != NULL) { *error = nil; }

        // Left here in case you want to test with visible results
        // return [string stringByReplacingOccurrencesOfString:NSStringSoftHyphenationToken withString:@"-"];
        return string;
    }
}

- (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];
}

@end

:)

...