NSAttributedString end of first line indent

这一生的挚爱 提交于 2019-12-04 13:43:58

问题


I want to have the first line in an NSAttributedString for a UITextView indented from the right side on the first line.

So the firstLineHeadIndent in NSParagraphStyle will indent the first line from the left. I want to do the same thing but from the right in my UITextView.

Here's a screenshot of how I want the text to wrap.


回答1:


The Setting Text Margins article from the Text System User Interface Layer Programming Guide has this figure:

As you can see, there's no built-in mechanism to have a first line tail indent.

However, NSTextContainer has a property exclusionPaths which represents parts of its rectangular area from which text should be excluded. So, you could add a path for the upper-right corner to prevent text from going there.

UIBezierPath* path = /* compute path for upper-right portion that you want to exclude */;
NSMutableArray* paths = [textView.textContainer.exclusionPaths mutableCopy];
[paths addObject:path];
textView.textContainer.exclusionPaths = paths;



回答2:


I'd suggest to create 2 different NSParagraphStyle: one specific for the first line and the second one for the rest of the text.

    //Creating first Line Paragraph Style
NSMutableParagraphStyle *firstLineStyle = [[NSMutableParagraphStyle alloc] init];
[firstLineStyle setFirstLineHeadIndent:10];
[firstLineStyle setTailIndent:200]; //Note that according to the doc, it's in point, and go from the origin text (left for most case) to the end, it's more a length that a "margin" (from right) that's why I put a "high value"
    //Read there: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/ApplicationKit/Classes/NSMutableParagraphStyle_Class/index.html#//apple_ref/occ/instp/NSMutableParagraphStyle/tailIndent

    //Creating Rest of Text Paragraph Style
NSMutableParagraphStyle *restOfTextStyle = [[NSMutableParagraphStyle alloc] init];
[restOfTextStyle setAlignement:NSTextAlignmentJustified];
//Other settings if needed

    //Creating the NSAttributedString
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:originalString];
[attributedString addAttribute:NSParagraphStyleAttributeName value:firstLineStyle range:rangeOfFirstLine];
[attributedString addAttribute:NSParagraphStyleAttributeName
                         value:restOfTextStyle
                         range:NSMakeRange(rangeOfFirstLine.location+rangeOfFirstLine.length,
                                           [originalString length]-(rangeOfFirstLine.location+rangeOfFirstLine.length))];

    //Setting the NSAttributedString to your UITextView
[yourTextView setAttributedText:attributedString]; 


来源:https://stackoverflow.com/questions/27855528/nsattributedstring-end-of-first-line-indent

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!