2

UILabelで通貨と価格を提示する必要があります。1つのラベルで、ただし異なるフォントサイズを使用します。これで、次のようになります。

ここに画像の説明を入力してください

...そして私はそれをdrawTextInRectをオーバーライドしました:このように:

- (void)drawTextInRect:(CGRect)rect{

    CGSize textSize = [self.text sizeWithFont:self.font];
    textSize.width -= textSize.width/12;
    CGRect analogRect = CGRectMake(0, 0, textSize.width, self.frame.size.height);
    CGPoint centrino = self.center;

    self.frame = analogRect;
    self.center = centrino;

    NSString *currency = [self.text substringWithRange:NSMakeRange(0, 3)];
    NSString *amount = [self.text substringWithRange:NSMakeRange(3, self.text.length - 3)];

    self.text = currency;
    self.textAlignment = UITextAlignmentLeft;
    self.font = [UIFont fontWithName:@"Helvetica-Bold" size:30.];
    self.baselineAdjustment = UIBaselineAdjustmentAlignBaselines;
    [super drawTextInRect:analogRect];

    self.text = amount;
    self.textAlignment = UITextAlignmentRight;
    self.font = [UIFont fontWithName:@"Helvetica-Bold" size:40.];
    [super drawTextInRect:analogRect];    
}

いいですね。

しかし、次のように、通貨と価格を一番下に揃える必要があります。

ここに画像の説明を入力してください

ご覧のとおり、「EUR」はサイズが小さく、中央に配置されているため、高く見えるため、強制的に低くする必要があります。

これを行う方法を提案してください。

前もって感謝します!

ノート:

2つの異なるラベルを使用するのは私には良くありません。私は単一のラベルでそれをしなければなりません。

4

5 に答える 5

2

2つのアイデア:1)UILabelをサブクラス化しているので、サブクラスの実装内に通貨タイプの2番目のラベルを配置できますが、ビューではラベルが1つだけであると見なされます。2)本日iOS 6でNDAが解除されたため、属性付き文字列を確認することをお勧めします。ああ、そして「UILabel」ではなく「UILabel」を書くための+1。

于 2012-09-19T15:43:08.253 に答える
1

皆さん、迅速な回答をありがとうございましたが、調査する時間がないので、初心者向けの解決策を見つけました。

私は恥を感じますが、ここにあります:

- (void)setCurrencyAndPrice{

//set the labels' texts
    [label_currency setText:@"EUR"];
    [label_amount setText:@"12.34"];

//set the sizes to fit the content
    [label_currency sizeToFit];
    [label_amount sizeToFit];

//read the new frame of the labels
    CGRect curRect = label_currency.frame;
    CGRect amoRect = label_amount.frame;

//adjust the position of the price to the top-right
    [label_amount setFrame:CGRectMake(320 - amoRect.size.width - 10, 0, amoRect.size.width, amoRect.size.height)];

//read again the price frame
    amoRect = label_amount.frame;

//stick the currency to the price, spacing 10 pixels
    [label_currency setFrame:CGRectMake(amoRect.origin.x - curRect.size.width - 10, 11, curRect.size.width, curRect.size.height)];

}

ご覧のとおり、2つの異なるラベルを使用するだけで、オーバーライドするものは何もありません。まさに私がやりたくなかったことですが、コーディングするよりも時間が速くなります。

乾杯!

PS:私は自分で解決策を見つけましたが、@ MichaelMangoldのアイデアが好きなので、彼の答えを受け入れます。

于 2012-09-19T16:15:53.567 に答える
1

2つのUILabelを使用する代わりに、複数のテキストフォントのスタイルと色を使用して1つのラベルを作成できます。ここに例があります、それはあなたを助けるかもしれません:

UILabel *customLbl = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 200, 25)];
customLbl.backgroundColor = [UIColor yellowColor];
[self createTwoTextStyleInSingleUILabel:customLbl];// custom method calling
[self.view addSubview:customLbl];

カスタムメソッドは次のようになります。このメソッドを適用する前に、QuartzCoreフレームワーク(CALayersに必要)とCoreTextフレームワーク(属性付き文字列に必要)をプロジェクトに追加します。

  #import <QuartzCore/QuartzCore.h>
  #import <CoreText/CoreText.h>  

- (void)createTwoTextStyleInSingleUILabel: (UILabel *) myLabel{
NSString *firstText = NSLocalizedString(@"First text:", nil);
NSString *secondText = [NSString stringWithFormat:@"%@ %@",firstText,@"Second text"];
CATextLayer *myLabelTextLayer;
/* Create the text layer on demand */
if (!myLabelTextLayer) {
    myLabelTextLayer = [[CATextLayer alloc] init];
    myLabelTextLayer.backgroundColor = [UIColor clearColor].CGColor;
    myLabelTextLayer.wrapped = NO;
    CALayer *layer = myLabel.layer; //assign layer to your UILabel
    myLabelTextLayer.frame = CGRectMake((layer.bounds.size.width-180)/2 + 10, (layer.bounds.size.height-30)/2 + 10, 180, 30);
    myLabelTextLayer.contentsScale = [[UIScreen mainScreen] scale];
    myLabelTextLayer.alignmentMode = kCAAlignmentCenter;
    [layer addSublayer:myLabelTextLayer];
}
/* Create the attributes (for the attributed string) */
// customizing first string
CGFloat fontSize = 16;
UIFont *boldFont = [UIFont boldSystemFontOfSize:fontSize];
CTFontRef ctBoldFont = CTFontCreateWithName((__bridge CFStringRef)boldFont.fontName, boldFont.pointSize, NULL);
CGColorRef cgColor = [UIColor redColor].CGColor;
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                            (__bridge id)ctBoldFont, (id)kCTFontAttributeName,
                            cgColor, (id)kCTForegroundColorAttributeName, nil];
CFRelease(ctBoldFont);
 // customizing second string
UIFont *font = [UIFont systemFontOfSize:16];
CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef)font.fontName, font.pointSize, NULL);
CGColorRef cgSubColor = [UIColor blackColor].CGColor;
NSDictionary *subAttributes = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)ctFont, (id)kCTFontAttributeName,cgSubColor, (id)kCTForegroundColorAttributeName, nil];
CFRelease(ctFont);
/* Create the attributed string (text + attributes) */
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:secondText attributes:attributes];
float lengthOfSecondString = 12.0; // length of second string including blank space inbetween text, space in front , space after text.. Be careful, your  app may crash here if length is beyond the second text length (lengthOfSecondString = text length + blank spaces)
[attrStr addAttributes:subAttributes range:NSMakeRange(firstText.length, lengthOfSecondString)];
// you can add another subattribute in the similar way as above , if you want change the third textstring style
/* Set the attributes string in the text layer :) */
myLabelTextLayer.string = attrStr;
myLabelTextLayer.opacity = 1.0; //to remove blurr effect

}
于 2012-09-20T10:21:03.673 に答える
0

このライブラリはあなたのために働きますhttps://github.com/AliSoftware/OHAttributedLabel

于 2012-09-19T15:43:06.500 に答える
0

ValueUnitsLabelというUIViewサブクラスを作成します。2つのラベルを付けて、フレーミング、フォントサイズなどを制御できるようにします。NSLocaleの読み取りについても賢くなります。

于 2012-09-19T15:47:06.207 に答える