问题
I'm using the following code to generate a NSAttributedString
for UILabel
in iOS 8.
// 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];
However it seems that the NSTextAttachment
will effect the vertical position of truncated tails, just like the following pictures.
Is there a way to set the vertical aignment for the truncated tails?
My goal is to have bottom align tails in Chinese language.
This is an icon for test.
回答1:
Try this One
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;
It will Give output Like this
回答2:
You can try to use NSMutableParagraphStyle to set the paragraphStyle. Here is the Code:
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
回答3:
OK, finally I choose a ugly way to fix this problem by setting NSBaselineOffsetAttributeName
for truncate tail.
Here is a way to calculate the truncate part. But in my case, my label width is fixed so that I can directly set the range for control.
if (title.length > 10 && ([[[UIDevice currentDevice] systemVersion] floatValue] < 9.0)) {
[attributedText addAttribute:NSBaselineOffsetAttributeName value:@(-4) range:NSMakeRange(9, 1)];
}
来源:https://stackoverflow.com/questions/39643542/setting-vertical-align-of-truncated-tails-for-nsattributedstring-with-nstextatta