2012-03-28 10 views
15

私はUILabelsのテキストのベースラインを揃える必要があります。私が現在行っていることは、テキストを含むUILabelsのベースラインを整列させていることです.2つのラベルのテキストフォントサイズが異なると、UILabelsのベースラインは整列しますが、テキストのベースラインの位置がずれてしまいますミスアラインメント)。ラベルはカスタムUIViewサブクラスに含まれています。したがって、selfは、包括的なUIViewを指します。ここiOSでUILabelsのテキストのベースラインをさまざまなフォントサイズに揃える方法は?

は、関連するコード

[self.mySmallLabel sizeToFit]; 
[self.myBigLabel sizeToFit]; 

self.mySmallLabel.frame = CGRectMake(0,  
            self.bounds.size.height - self.mySmallLabel.bounds.size.height, 
            self.mySmallLabel.bounds.size.width, 
            self.mySmallLabel.bounds.size.height); 

self.myBigLabel.frame = CGRectMake(self.mySmallLabel.frame.origin.x + self.mySmallLabel.bounds.size.width, 
            self.bounds.size.height - self.myBigLabel.bounds.size.height, 
            self.myBigLabel.bounds.size.width, 
            self.myBigLabel.bounds.size.height); 
[self.mySmallLabel sizeToFit]; 
[self.myBigLabel sizeToFit]; 

以下のリンク先の画像でaligmentでこのコードの結果です。

Misalignemnt

あなたはUILabelベースラインが整列されていても、見ることができるように、テキストのベースラインは、小さなマージンでずれています。テキストのベースラインを動的に調整するには(実行時にフォントサイズが変わる可能性があるため)

答えて

25

私は別の場所のカップルでthis answerを使用していたが、ベースラインは、時々のRetinaディスプレイ上のピクセルオフでした。以下のスニペットは、画面のスケールを占め:

[majorLabel sizeToFit]; 
[minorLabel sizeToFit]; 

CGRect changedFrame = minorLabel.frame; 
changedFrame.origin.x = CGRectGetWidth(majorLabel.frame); 

const CGFloat scale = [UIScreen mainScreen].scale; 
const CGFloat majorLabelBaselineInSuperView = CGRectGetMaxY(majorLabel.frame) + majorLabel.font.descender; 
const CGFloat minorLabelBaselineInOwnView = CGRectGetHeight(minorLabel.frame) + minorLabel.font.descender; 
changedFrame.origin.y = ceil((majorLabelBaselineInSuperView - minorLabelBaselineInOwnView) * scale)/scale; 

minorLabel.frame = changedFrame; 
+4

自動レイアウトを使用するバージョンはありますか? – adib

+9

自動レイアウトのバージョンは簡単です:2つのラベルを 'NSLayoutAttributeBaseline'(またはあなたが何をしようとしているかに応じて' NSLayoutAttributeLastBaseline'または 'NSLayoutAttributeFirstBaseline')で整列させるだけです。 –

3

私はこれを自分で(今すぐ)探していて、almost identical questionで私の答えを見つけました。それは簡単な解決策ではありませんが、我々は数学を行う必要があります。

私は2つの異なるラベルでそれを行う必要がありました。私はUIViewのサブクラスでそれをやっています。

- (void)layoutSubviews { 
    [majorLabel sizeToFit]; 
    [minorLabel sizeToFit]; 

    CGRect changedFrame = minorLabel.frame; 
    changedFrame.origin.x = majorLabel.frame.size.width; 
    changedFrame.origin.y = (majorLabel.frame.size.height + majorLabel.font.descender) - (minorLabel.frame.size.height + minorLabel.font.descender); 
    minorLabel.frame = changedFrame; 
} 
8

あなたは単純計算でUIFontのアセンダ値を使用してUILabelsの任意のペアのためのピクセルの完璧なベースラインの位置合わせを得ることができます。 font.ascender値は小数可能性があるため

[majorLabel sizeToFit]; 
[minorLabel sizeToFit]; 

CGRect changedFrame = minorLabel.frame; 
changedFrame.origin.y = ceilf(majorLabel.frame.origin.y + (majorLabel.font.ascender - minorLabel.font.ascender)); 
minorLabel.frame = changedFrame; 

ceilf()が使用されている:ここでは方法です。

これを網膜と非網膜の両方のデバイスでテストしたところ、優れた結果が得られました。 x軸上の2つのラベルの相対的な位置は、必要に応じて省略されています。あなたがUIFontのascenderが何であるか(そして他のUIFontの情報)についての簡単な説明が必要な場合は、この明確で簡潔なarticleをチェックしてください。

+0

私はこれを試しましたが、iOS5での私のテストでは、ascenderとdescenderは両方とも0です –

関連する問題