8

Я использую следующий код для создания NSAttributedString для UILabel в прошивке 8.Установки Вертикального выравнивания укороченных хвостов для NSAttributedString с NSTextAttachment

// a long long Chinese title 
NSString *title = @"这是一个很长很长很长很长很长很长的中文标题"; 
// setup icon attachment 
NSTextAttachment *iconAttachment = [[NSTextAttachment alloc] init]; 
iconAttachment.image = [UIImage imageNamed:imageName]; 
iconAttachment.bounds = bounds; 
NSAttributedString *ycardImageString = [NSAttributedString attributedStringWithAttachment:iconAttachment]; 

// setup attributed text 
NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:title]; 
if (shouldShowYcard) { 
    [attributedText insertAttributedString:ycardImageString atIndex:0]; 
    [attributedText insertAttributedString:[[NSAttributedString alloc] initWithString:@" "] atIndex:1]; 
    [attributedText addAttribute:NSBaselineOffsetAttributeName value:@(offset) range:NSMakeRange(0, 1)]; 
} 
NSRange titleRange = NSMakeRange(shouldShowYcard ? 2 : 0, title.length); 
[attributedText addAttribute:NSFontAttributeName value:font range:titleRange]; 
[attributedText addAttribute:NSForegroundColorAttributeName value:color range:titleRange]; 

Однако, кажется, что NSTextAttachment будет влиять на вертикальное положение усеченного хвосты, как и следующие фотографии.

NSAttributedString with NSTextAttachment NSAttributedString without NSTextAttachment NSAttributedString with NSTextAttachment In English NSAttributedString without NSTextAttachment In English

Есть ли способ, чтобы установить вертикальную aignment для укороченных хвостов?

Моя цель состоит в том, чтобы иметь нижние выровняющие хвосты на китайском языке.

Это значок для теста. icon

+0

Вы загрузили свой снимок экрана, который показывает текст на английском языке? –

+0

@ ХиманшуМорадия Я просто загружаю снимок экрана на английском языке. Но кажется, что это только одна ошибка в Китае ... –

+0

на вашем экране снял свои показанные точки. из-за большой длины текста и вам нужен тот же результат с вертикальным выравниванием? –

ответ

0

ОК, я, наконец, выбрать некрасивый способ это исправить проблему, установив NSBaselineOffsetAttributeName для укороченного хвоста.

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

if (title.length > 10 && ([[[UIDevice currentDevice] systemVersion] floatValue] < 9.0)) { 
    [attributedText addAttribute:NSBaselineOffsetAttributeName value:@(-4) range:NSMakeRange(9, 1)]; 
} 
2

Вы можете попробовать использовать NSMutableParagraphStyle для установки параметра paragraphStyle. Вот код:

let label1 = UILabel(frame: CGRect(x: 50, y: 50, width: 100, height: 30)) 
    let label2 = UILabel(frame: CGRect(x: 50, y: 90, width: 100, height: 30)) 
    view.addSubview(label1) 
    view.addSubview(label2) 
    let t = "12341421dsadyusatdiuwtquyidtywatyudigsaydgsadysaghdkgaugduiyyudgasgdj" 
    let iconAttachment = NSTextAttachment() 
    iconAttachment.image = UIImage(named: "caseEditorBtn0") 
    iconAttachment.bounds = CGRect(x: 0, y: 0, width: 20, height: 30); 
    let ycardImageString = NSAttributedString(attachment: iconAttachment) 
    let yT0 = NSMutableAttributedString(string: t) 
    let yT1 = NSMutableAttributedString(string: t) 

    let p = NSMutableParagraphStyle() 
    p.lineBreakMode = .byTruncatingTail //set line break model 
    p.alignment = .right    //set aligment 
    yT1.setAttributes([NSParagraphStyleAttributeName: p], range: NSRange(location: 0, length: yT1.length)) 
    yT0.setAttributes([NSParagraphStyleAttributeName: p], range: NSRange(location: 0, length: yT0.length)) 
    //insert you custom text attachment at last, or it may be not show 
    yT0.insert(ycardImageString, at: 0) 

    label1.attributedText = yT0 
    label2.attributedText = yT1 
+0

Я попытался установить 'NSMutableParagraphStyle' с' lineBreakMode', но он не работал с китайским текстом. –

+0

Я обнаружил, что моя проблема на iOS 8 только –

4

Попробуйте это один

UILabel *lbl = [[UILabel alloc]initWithFrame:CGRectMake(50, 300, 300, 30)]; 
    [self.view addSubview:lbl]; 
    NSString *t= @"这是一个很长很长很长很长很长很长的中文标题漢字"; 
    NSTextAttachment *iconatt = [[NSTextAttachment alloc]init]; 
    iconatt.image = [UIImage imageNamed:@"phnzY.png"]; 
    iconatt.bounds = CGRectMake(0, 0, 44, 22); 

    NSAttributedString *ycardstring = [NSAttributedString attributedStringWithAttachment:iconatt]; 
    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:t]; 
    [attributedText insertAttributedString:ycardstring atIndex:0]; 
    [attributedText insertAttributedString:[[NSAttributedString alloc] initWithString:@" "] atIndex:1]; 
    [attributedText addAttribute:NSBaselineOffsetAttributeName value:@(0.0) range:NSMakeRange(0, 1)]; 
     NSRange titleRange = NSMakeRange(0 , t.length); 
    [attributedText addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:22.0] range:titleRange]; 
    [attributedText addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:titleRange]; 
    lbl.attributedText = attributedText; 

Это даст выход Как это

output

+0

не сработала. Ваш код дает результат, поскольку вы не вставляете 'ycardstring' в' y10' или 'y11' –

Смежные вопросы