9

UILabel(cocoa touchフレームワーク)があり、テキストを左右揃えにしたい。結果として、内部のテキストが引き伸ばされます。

例:「物理的な製造と出荷のコストを節約しながら」というテキストがある場合、次のように表示されます。

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

あなたが左右の正当化を見ることができるように...

どうすればそれを達成できますか?

どうもありがとう

  • 質問を投稿するために二重の質問をしなければならなかったのは残念です。
4

8 に答える 8

9

私の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!

(注:UITextAlignmentJustifyOHAttributedLabelヘッダーで定義された定数であり、位置合わせを正当化するための対応するCoreText定数と一致します。この定数はAppleのSDKには存在しません)


[編集]iOS6SDK

iOS6 SDK以降、はUITextAlignmentJustify機能しなくなり、実行時にクラッシュが発生します。ここで、ラベルNSAttributedStringのプロパティを使用する代わりに、自分自身のテキスト配置を設定する必要があります。textAlignment

于 2011-09-11T16:27:03.710 に答える
4

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), &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];
于 2011-09-11T16:22:49.710 に答える
2

IOS6のリリース後は非常に簡単です。これを使用してください

//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;
于 2013-07-02T13:01:43.200 に答える
2

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;
于 2014-11-19T09:59:39.947 に答える
2

完璧な解決策は使用することです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;
于 2016-07-27T13:37:54.437 に答える
1

これはいわゆる「完全な位置合わせ」と呼ばれますが、UILabelシステム(「配置」(左、右、中央)のみ)ではサポートされていません。これが必要な場合は、CoreTextなどを使用してコントロールを作成し、自分でコーディングする必要があります。

于 2011-09-11T13:18:50.737 に答える
0

これは、かなりのカスタムコーディングでのみ実行できることに同意します。かなり重いものになると思います。あなたがそれに入る前に; これは要件によって異なります。いくつかのコーディングUIWebViewを使用して、テキストのスタイルと配置をもう少し自由に管理できると思う場所を用意することを検討してください。HTMLCSS

于 2011-09-11T13:32:46.497 に答える
-2

以下は簡単な修正として機能しますが、黒のプレーンテキスト以外のものについては、スタイリングまたはcssが必要になることに注意してください。

(From: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];
于 2011-09-11T15:00:42.627 に答える