38

すでにロードを検索しましたが、答えが見つかりませんでした。

私は通常のUILabelを持っており、次のように定義されています。

    UILabel *totalColors = [[[UILabel alloc] initWithFrame:CGRectMake(5, 7, 120, 69)] autorelease];
    totalColors.text = [NSString stringWithFormat:@"%d", total];
    totalColors.font = [UIFont fontWithName:@"Arial-BoldMT" size:60];
    totalColors.textColor = [UIColor colorWithRed:221/255.0 green:221/255.0 blue:221/255.0 alpha:1.0];
    totalColors.backgroundColor = [UIColor clearColor];
    [self addSubview:totalColors];

また、フォントサイズを維持しながら、文字間の水平方向の間隔を狭くしたかったのです。

これを行う方法はありますか?それはかなり基本的なことです。

乾杯みんな、アンドレ

アップデート:

だから私はこのようにすることを余儀なくされました:

- (void) drawRect:(CGRect)rect 
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSelectFont (context, "Arial-BoldMT", 60, kCGEncodingMacRoman);
    CGContextSetCharacterSpacing (context, -10);
    CGContextSetTextDrawingMode (context, kCGTextFill);

    CGContextSetRGBFillColor(context, 221/255.0, 221/255.0, 221/255.0, 221/255.0);
    CGAffineTransform xform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix(context, xform);

    char* result = malloc(17);
    sprintf(result, "%d", totalNumber);

    CGContextShowTextAtPoint (context, 0, 54, result, strlen(result));
}

しかし、これを右に揃える必要があります。描かれたテキストの幅を知っていれば手動でそれを行うことができましたが、それを見つけることはほぼ不可能であることが証明されています。

ATSUについて読んだことがありますが、例が見つかりませんでした。

これは最悪です:/

4

5 に答える 5

43

iOS 6から、UILabelでNSAttributedStringを使用できます。

属性付き文字列では、属性NSKernAttributeNameを使用して文字間隔を設定できます

NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc] initWithString: @"Test test test test "];
[attrStr addAttribute:NSKernAttributeName value:@(4.0) range:NSMakeRange(0, attrStr.length)];

UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 300, 300, 100)];
label.attributedText = attrStr;
于 2013-12-03T10:53:41.483 に答える
11

UILabelを拡張して、文字間隔を変更しました。これで問題が解決し、UILabel自体からフォント、テキスト、色などが取得されます(適切なコーディング!)。

あなたは私がテキストを2回描いていることに気付くかもしれません。最初はクリアな色です。これは、ラベルのテキストを自動中央揃えにするためです。これは非効率的かもしれませんが、自動中心に配置するのは良いことではありませんか?

楽しみ!

@interface RALabel : UILabel {
}
@end  

@implementation RALabel 

- (void) drawRect:(CGRect)rect 
{

    // Drawing code

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSelectFont (context, [self.font.fontName cStringUsingEncoding:NSASCIIStringEncoding], self.font.pointSize, kCGEncodingMacRoman);
    CGContextSetCharacterSpacing(context, 1);
    CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
    CGAffineTransform myTextTransform = CGAffineTransformScale(CGAffineTransformIdentity, 1.f, -1.f );
    CGContextSetTextMatrix (context, myTextTransform);

    // draw 1 but invisbly to get the string length.
    CGPoint p =CGContextGetTextPosition(context);
    float centeredY = (self.font.pointSize + (self.frame.size.height- self.font.pointSize)/2)-2;
    CGContextShowTextAtPoint(context, 0, centeredY, [self.text cStringUsingEncoding:NSASCIIStringEncoding], [self.text length]);
    CGPoint v =CGContextGetTextPosition(context);

    // calculate width and draw second one.
    float width = v.x - p.x;
    float centeredX =(self.frame.size.width- width)/2;
    CGContextSetFillColorWithColor(context, [self.textColor CGColor]);
    CGContextShowTextAtPoint(context, centeredX, centeredY, [self.text cStringUsingEncoding:NSASCIIStringEncoding], [self.text length]);

}
于 2011-07-29T16:30:59.360 に答える
7

文字の間隔と右側の配置の解決策を考え出しました。

ここに行きます:

    NSString *number = [NSString stringWithFormat:@"%d", total];

    int lastPos = 85;

    NSUInteger i;
    for (i = number.length; i > 0; i--)
    {
        NSRange range = {i-1,1};
        NSString *n = [number substringWithRange:range];

        UILabel *digit = [[[UILabel alloc] initWithFrame:CGRectMake(5, 10, 35, 50)] autorelease];
        digit.text = n;
        digit.font = [UIFont fontWithName:@"Arial-BoldMT" size:60];
        digit.textColor = [UIColor colorWithRed:221/255.0 green:221/255.0 blue:221/255.0 alpha:1.0];
        digit.backgroundColor = [UIColor clearColor];
        [self addSubview:digit];

        CGSize textSize = [[digit text] sizeWithFont:[digit font]];
        CGFloat textWidth = textSize.width;

        CGRect rect = digit.frame;
        rect.origin.x = lastPos - textWidth;
        digit.frame = rect;

        lastPos = rect.origin.x + 10;
    }

文字の間隔は、最後の行の「10」です。アラインメントはlastPosから取得されます。

これがそこにいる人の助けになることを願っています。

于 2010-03-30T15:33:04.813 に答える
3

Swiftの場合:

let myTitle = "my title"
let titleLabel = UILabel()
let attributes: NSDictionary = [
    NSFontAttributeName:UIFont(name: "HelveticaNeue-Light", size: 20),
    NSForegroundColorAttributeName:UIColor.whiteColor(),
    NSKernAttributeName:CGFloat(2.0)
]
let attributedTitle = NSAttributedString(string: myTitle, attributes: attributes as? [String : AnyObject])

titleLabel.attributedText = attributedTitle
titleLabel.sizeToFit()
于 2015-11-17T22:20:59.837 に答える
0

公開されているバージョンのiPhoneOSにはありません。;-)現在iPhone開発者である場合は、iPhoneOS3.2の「新着情報」のメモを調べることでiPhoneOSがどこに向かっているのかを知ることができます。

更新:カーニングのサポートを追加したiOS v3.2は、私がこれを投稿したとき、まだNDAの下にありました。最新の回答については、iPhoneUILabelでカーニングを設定する方法を参照してください。

于 2010-03-30T14:09:54.960 に答える