Как я могу активировать автоматический перенос в iOS?
Я попытался установить коэффициент дефиса равным 1 в параметрах атрибутированного текста UILabel, однако я не получаю никаких дефисов.
Как я могу активировать автоматический перенос в iOS?
Я попытался установить коэффициент дефиса равным 1 в параметрах атрибутированного текста UILabel, однако я не получаю никаких дефисов.
UITextView
вместо UILabel
. Тогда hyphenationFactor
(либо как атрибут NSParagraphStyle
, либо как свойство NSLayoutManager
) должен работать (благодаря новому TextKit).UIWebView
и -webkit-hyphens
.CFStringGetHyphenationLocationBeforeIndex()
, которую вы упомянули в комментарии. Эта функция только дает вам подсказку о том, где ставить дефисы в строке для определенного языка. Затем вам нужно самостоятельно разбить строки текста, используя функции основного текста (например, CTLineCreateWithAttributedString()
и все такое). См. Знакомство с TextKit (абзац под названием "Расстановка переносов" объясняет логика процесса основного текста без кода) и расстановка переносов с основным текстом на iPad (дает пример кода, но веб-сайт, похоже, сейчас не работает). Это, вероятно, будет больше работы, чем вы хотите!NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init]; paragraph.hyphenationFactor = 1; NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"asdf" attributes:[NSDictionary dictionaryWithObjectsAndKeys:paragraph, NSParagraphStyleAttributeName, nil]];
тоже работает на UILabel!
- person Chris; 05.11.2013
hyphenationFactor
установлено на 1.0
, а язык устройства установлен на нераспространенный, т. е. польский или хорватский, в конце слова, написанного через дефис, отсутствует тире.
- person Kubba; 07.03.2016
Вам нужно добавить в строку «мягкий перенос». Это «-», которые не видны при рендеринге, а просто ставятся в очередь для CoreText или UITextKit, чтобы узнать, как разбивать слова.
Мягкий дефис, который вы должны поставить в тексте:
unichar const kTextDrawingSoftHyphenUniChar = 0x00AD;
NSString * const kTextDrawingSoftHyphenToken = @""; // NOTE: UTF-8 soft hyphen!
Пример кода
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
typedef enum {
NSStringSoftHyphenationErrorNotAvailableForLocale
} NSStringSoftHyphenationError;
extern NSString * const NSStringSoftHyphenationErrorDomain;
@interface NSString (SoftHyphenation)
- (NSString *)softHyphenatedStringWithLocale:(NSLocale *)locale error:(out NSError **)error;
@end
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
Быстрая версия:
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.hyphenationFactor = 1
paragraphStyle.alignment = .center
let string = NSAttributedString(string: "wyindywidualizowany indywidualista".uppercased(),
attributes: [NSParagraphStyleAttributeName : paragraphStyle])
myLabel.attributedText = string