UILabelcertificate左右

我有UILabel(cocoa触摸框架),我想右和左alignment它的文本。 因此它会拉伸内部的文字。

例如:如果我有这样的文字“ 虽然物理制造和运输的节约成本 ”,它会显示如下:

"While the saved" "costsof" "physical" "manufacturing" "and shipping" 

正如你可以看到左右alignment…

我怎么能实现?

非常感谢

  • 对不起,我不得不把双重问题张贴在问题上。

你应该使用我的OHAttributedLabel类。

它具有显示NSAttributedString所需的NSAttributedString ,包括certificate左边,中间,右边和正确的 ,并且使用起来非常简单。

你可以在github上find它。 请参阅提供的示例代码,其中还显示了如何更改文本alignment方式。

 // 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常量匹配,用于alignmentalignment。这个常量在Apple的SDK中不存在)


[编辑] iOS6 SDK

由于iOS6 SDK, UITextAlignmentJustify不再工作,并在运行时产生崩溃。 现在你应该设置NSAttributedString本身的文本alignment方式,而不是使用标签的textAlignment属性。

使用UIWebView可能会很慢,所以如果这是一个问题,CoreText是要走的路。

以下是使用核心文本在视图上显示属性string的一些代码。 它缩进像UILabel。 我已经留下了一些其他的段落格式选项来说明如何设置其他段落属性,并将属性string设置为粗体。 记住你需要添加CoreText框架,否则你会得到构build错误。

这段代码没有完全certificate最后一行。 不知道你可以在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), &paragraphSpacing}, { kCTParagraphStyleSpecifierParagraphSpacingBefore, sizeof(CGFloat), &paragraphSpacingBefore}, }; 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; 

完美的解决scheme是使用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或类似的东西构build一个控件。

同意这只能用一个很好的自定义编码来完成; 我认为这将是一些相当沉重的东西。 在你进入之前; 这取决于您的要求; 考虑有一个UIWebView地方,我想你将能够使用一些HTMLCSS编码来更自由地pipe理文本样式和alignment。

下面的工作作为一个快速修复,但要注意的是,除了黑色纯文本以外,你需要一些样式或CSS。

(来自: 在UITextView-iPhone中alignmentalignment )

我已经到了一个可行的解决scheme。 首先,你需要改变你的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];