ios UILabel 左右对齐

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7378409/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-30 21:28:10  来源:igfitidea点击:

UILabel justify left and right

iphoneioscocoa-touchuilabeltext-justify

提问by M.Saleh

i have UILabel (cocoa touch framework) and i want to right and left justify its text. as a consequence it will stretch the text inside.

我有 UILabel(可可触摸框架),我想左右对齐它的文本。因此,它会拉伸里面的文本。

Example: like if i had this text "While the saved costs of physical manufacturing and shipping" it would appear like the following:

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

"While the saved"
"c o s t s   o f"
"p h y s i c a l"
 "manufacturing"
"a n d  shipping"

as you can see left and right justification...

正如你所看到的左右对齐......

how can i achieve that ???

我怎样才能做到这一点???

many thanks

非常感谢

  • i'm sorry i had to put the double qoutations to post the question.
  • 对不起,我不得不提出双重问题来发布问题。

采纳答案by AliSoftware

You should use my OHAttributedLabelclass.

你应该用我的OHAttributedLabel课。

It has everything needed to display an NSAttributedString, including justifying left, center, right… and justified, and is really simple to use.

它具有显示 所需的一切NSAttributedString,包括对齐对齐、居中对齐、右对齐……和对齐,并且使用起来非常简单。

You can find it here on github. See the sample code provided that also shows how to change text justification.

你可以在 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!

(Note: UITextAlignmentJustifyis a constant defined in OHAttributedLabel headers that matches corresponding CoreText constant for justify alignment. This constant does not exists in Apple's SDK)

(注意:UITextAlignmentJustify是在 OHAttributedLabel 标头中定义的一个常量,它匹配相应的 CoreText 常量以进行对齐对齐。Apple 的 SDK 中不存在此常量)



[EDIT] iOS6 SDK

[编辑] iOS6 SDK

Since iOS6 SDK, the UITextAlignmentJustifydoes not work anymore and generate a crash at runtime. Now you should set the text alignment of your NSAttributedStringitself instead of using the textAlignmentproperty of the label.

从 iOS6 SDK 开始,UITextAlignmentJustify它不再工作并在运行时产生崩溃。现在您应该设置自己的文本对齐方式,NSAttributedString而不是使用textAlignment标签的属性。

回答by Obliquely

Using UIWebView can be slow, so if that's an issue CoreText is the way to go.

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

Here's some code that uses core text to display an attributed string on a view. It indents a bit like UILabel. I've left some other paragraph formatting options in to illustrate how you can set other paragraph properties and also set the attributed string to bold. Remember you'll need to add the CoreText framework otherwise you'll get build errors.

下面是一些使用核心文本在视图上显示属性字符串的代码。它的缩进有点像 UILabel。我留下了一些其他段落格式选项来说明如何设置其他段落属性并将属性字符串设置为粗体。请记住,您需要添加 CoreText 框架,否则会出现构建错误。

This code doesn't full justify the last line. Not sure you can get this for free in CoreText.

这段代码不能完全证明最后一行。不确定您是否可以在 CoreText 中免费获得它。

the .h file

.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

And the .m file

和 .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

And to put to use, something like this:

并投入使用,是这样的:

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];

回答by Nofel Mahmood

Its very easy after the release of IOS 6. Use this

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;

回答by Annu

From iOS 6 you can use NSMutableAttributedString for this,

从 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;

回答by Ahmed Abdallah

The perfect solution is to used NSMutableParagraphStyle

完美的解决方案是使用 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;

回答by Adam Wright

This is so called "full justification", but isn't supported by the UILabel system (which only has "alignments" - left, right and centre). If you want this, you'll have to code it up yourself, building a control with CoreText or similar.

这就是所谓的“完全对齐”,但 UILabel 系统不支持(它只有“对齐”——左、右和中心)。如果你想要这个,你必须自己编写代码,用 CoreText 或类似的东西构建一个控件。

回答by Madhu

Agree that this can only be done with a good bit of custom coding; which I would think will be some pretty heavy stuff. Before you get into that; and this is depending on your requirement; do consider having a UIWebViewwhere I imagine you would be able to manage text styles and alignments with a bit more freedom using some HTMLand CSScoding.

同意这只能通过一些自定义编码来完成;我认为这将是一些非常沉重的东西。在你开始之前;这取决于您的要求;请考虑拥有一个UIWebView我想象的地方,您可以使用 someHTMLCSScoding来更自由地管理文本样式和对齐方式。

回答by Daniel G. Wilson

The following works as a quick fix, but note that for anything more than black plain text you'll need some styling or css.

以下内容可作为快速修复,但请注意,对于黑色纯文本以外的任何内容,您都需要一些样式或 css。

(From: Justified Alignment in UITextView - iPhone)

(来自:UITextView 中的对齐对齐 - iPhone

I have come to a solution that works. First of all, you will need to change your UITextView and use a UIWebView instead.

我找到了一个有效的解决方案。首先,您需要更改 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];