我有 UILabel (可可触摸框架),我想左右证明它的文本。因此,它会拉伸里面的文本。
示例:如果我有这样的文字“虽然节省了物理制造和运输的成本”,它会如下所示:
"While the saved"
"c o s t s o f"
"p h y s i c a l"
"manufacturing"
"a n d shipping"
如您所见,左右对齐...
我怎么能做到这一点???
非常感谢
- 很抱歉,我不得不提出双引号来发布问题。
我有 UILabel (可可触摸框架),我想左右证明它的文本。因此,它会拉伸里面的文本。
示例:如果我有这样的文字“虽然节省了物理制造和运输的成本”,它会如下所示:
"While the saved"
"c o s t s o f"
"p h y s i c a l"
"manufacturing"
"a n d shipping"
如您所见,左右对齐...
我怎么能做到这一点???
非常感谢
你应该用我的OHAttributedLabel
课。
它具有显示 所需的一切NSAttributedString
,包括左对齐、居中、右对齐……和对齐,并且使用起来非常简单。
你可以在 github 上找到它。请参阅提供的示例代码,其中还显示了如何更改文本对齐方式。
// suppose that label is an IBOutlet to an OHAttributedLabel (subclass oh UILabel)
label.textAlignment = UITextAlignmentJustify; // and that's all, OHAttributedLabel does everything needed for you!
(注意:UITextAlignmentJustify
是在 OHAttributedLabel 标头中定义的常量,它与相应的 CoreText 常量匹配以进行对齐对齐。该常量在 Apple 的 SDK 中不存在)
由于 iOS6 SDK,UITextAlignmentJustify
不再工作并在运行时产生崩溃。现在您应该设置自己的文本对齐方式,NSAttributedString
而不是使用textAlignment
标签的属性。
使用 UIWebView 可能会很慢,所以如果这是一个问题,CoreText 就是要走的路。
下面是一些使用核心文本在视图上显示属性字符串的代码。它的缩进有点像 UILabel。我留下了一些其他段落格式选项来说明如何设置其他段落属性并将属性字符串设置为粗体。请记住,您需要添加 CoreText 框架,否则会出现构建错误。
此代码不能完全证明最后一行。不确定您是否可以在 CoreText 中免费获得它。
.h 文件
//
// SmartLabel.h
//
#import <UIKit/UIKit.h>
#import <CoreText/CoreText.h> // needed for CTFontRef, CTFontCreateWithName
@interface SmartLabel : UIView
{
NSMutableAttributedString* _pgSmartString;
}
@property (nonatomic, retain) NSMutableAttributedString* smartString;
- (void) setText: (NSString*) string;
- (void) formatString;
@end
和 .m 文件
//
// SmartLabel.m
//
#import "SmartLabel.h"
@implementation SmartLabel
@synthesize smartString = _pgSmartString;
- (void)dealloc
{
[_pgSmartString release];
[super dealloc];
}
- (id)initWithFrame:(CGRect)frame;
{
if ((self = [super initWithFrame:frame]))
{
[self setBackgroundColor: [UIColor clearColor]];
}
return self;
}
- (void)drawRect:(CGRect)rect
{
CGContextRef graphicsContext = UIGraphicsGetCurrentContext();
CGContextSetTextMatrix(graphicsContext, CGAffineTransformIdentity);
// turns things right way up
CGContextTranslateCTM(graphicsContext, 0, self.bounds.size.height);
CGContextScaleCTM(graphicsContext, 1.0, -1.0);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)[self smartString]);
CGRect bounds = [self bounds];
bounds.origin.x = bounds.origin.x + 8;
bounds.size.width = bounds.size.width - 16;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, bounds);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, [[self smartString] length]), path, NULL);
CFRelease(path);
CTFrameDraw(frame, graphicsContext);
CFRelease(frame);
CFRelease(framesetter);
}
- (void) setText: (NSString*) string;
{
NSMutableAttributedString* attributedString = [[NSMutableAttributedString alloc] initWithString:string];
[self setSmartString:attributedString];
[attributedString release];
[self formatString];
}
- (void) formatString;
{
CTTextAlignment alignment = kCTJustifiedTextAlignment; // could put different alignments here
CGFloat paragraphSpacing = 11.0;
CGFloat paragraphSpacingBefore = 0.0;
CGFloat firstLineHeadIndent = 0.0;
CGFloat headIndent = 0.0;
CTParagraphStyleSetting altSettings[] =
{
{ kCTParagraphStyleSpecifierAlignment, sizeof(CTTextAlignment), &alignment},
{ kCTParagraphStyleSpecifierFirstLineHeadIndent, sizeof(CGFloat), &firstLineHeadIndent},
{ kCTParagraphStyleSpecifierHeadIndent, sizeof(CGFloat), &headIndent},
{ kCTParagraphStyleSpecifierParagraphSpacing, sizeof(CGFloat), ¶graphSpacing},
{ kCTParagraphStyleSpecifierParagraphSpacingBefore, sizeof(CGFloat), ¶graphSpacingBefore},
};
CTParagraphStyleRef style;
style = CTParagraphStyleCreate( altSettings, sizeof(altSettings) / sizeof(CTParagraphStyleSetting) );
if ( style == NULL )
{
NSLog(@"*** WARNING *** Unable To Create CTParagraphStyle in apply paragraph formatting" );
return;
}
[[self smartString] addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:(NSObject*)style,(NSString*) kCTParagraphStyleAttributeName, nil] range:NSMakeRange(0,[[self smartString] length])];
CFRelease(style);
UIFont* boldFont = [UIFont boldSystemFontOfSize:12.0];
CTFontRef boldCoreTextFontReference = CTFontCreateWithName ((CFStringRef)[boldFont fontName],[boldFont pointSize], NULL);
[[self smartString] addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:(NSObject*)boldCoreTextFontReference,(NSString*) kCTFontAttributeName, nil] range:NSMakeRange(0,[[self smartString] length])];
}
@end
并投入使用,像这样:
SmartLabel* smartLabel = [[SmartLabel alloc] initWithFrame:CGRectMake(20, 120, 90, 140.0)];
[[self window] addSubview:smartLabel];
[smartLabel setText:@"While the saved costs of physical manufacturing and shipping"];
[smartLabel release];
IOS 6发布后就很简单了。用这个
//build a style for justification
NSMutableParagraphStyle *stringStyle=[[NSMutableParagraphStyle alloc]init];
[stringStyle setAlignment:NSTextAlignmentJustified];
//build a string with the particular paragraph style
NSMutableAttributedString* yourString=[[NSMutableAttributedString alloc]init];
[yourString addAttribute:NSParagraphStyleAttributeName value:stringStyle range:NSMakeRange(0, [yourString length])];
//and here you go
UILabel *yourLabel;
yourlabel.attributedText=yourString;
从 iOS 6 开始,您可以为此使用 NSMutableAttributedString,
NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc] initWithData:[@"Your String value" dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} documentAttributes:nil error:nil];
NSRange rangeOfTitle = NSMakeRange(0,[attrStr length]);
[attrStr addAttribute: NSFontAttributeName value:[UIFont fontWithName:@"Calibri" size:19.0]range:rangeOfTitle];
myLabel.attributedText = attrStr;
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:10];
style.lineBreakMode = NSLineBreakByWordWrapping;
style.alignment = NSTextAlignmentJustified;
[attrStr addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, myLabel.text.length)];
myLabel.attributedText = attrStr;
完美的解决方案是使用NSMutableParagraphStyle
NSMutableParagraphStyle *paragraphStyles = [[NSMutableParagraphStyle alloc] init];
paragraphStyles.alignment = NSTextAlignmentJustified; //justified text
paragraphStyles.firstLineHeadIndent = 1.0;
NSDictionary *attributes = @{NSParagraphStyleAttributeName: paragraphStyles};
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString: YourString attributes: attributes];
YourLabel.attributedText = attributedString;
这就是所谓的“完全对齐”,但 UILabel 系统不支持(它只有“对齐” - 左、右和中心)。如果你想要这个,你必须自己编写代码,用 CoreText 或类似的东西构建一个控件。
同意这只能通过一些自定义编码来完成;我认为这将是一些非常沉重的东西。在你开始之前;这取决于您的要求;确实考虑有一个UIWebView
我想你可以使用一些HTML
和CSS
编码更自由地管理文本样式和对齐的地方。
以下是一种快速修复,但请注意,对于黑色纯文本以外的任何内容,您都需要一些样式或 css。
(来自:UITextView 中的对齐对齐 - iPhone)
我找到了一个可行的解决方案。首先,您需要更改 UITextView 并改用 UIWebView。
Details.h
@interface Details : UIViewController {
IBOutlet UIWebView *descripcion;
}
@property (nonatomic, retain) UITextView *descripcion;
Then, load your UIWebView as follows:
Details.m
[descripcion loadHTMLString:[NSString stringWithFormat:@"<div align='justify'>%@<div>",YOUR_TEXT] baseURL:nil];