2

クイック バージョン: UILabel の "center" プロパティの値が、サイズ属性が親コンテナーの上部と下部にバインドされている場合との間で変化するのはなぜですか? その動作を変更または回避するにはどうすればよいですか?

詳細を含む長いバージョン: 次のように 2 つのラベルの間に線を引いています (黄色の線):

ここに画像の説明を入力

線の終点を計算するには、UILabels の center プロパティ (この写真では、ラベルは 2.5kHz と 20 Hz と表示されています) を使用してから、ラベルの高さの + または - 半分を使用します。この手法は、下の例/図でうまく機能します。ただし、画面サイズを iPhone5 (背の高い方) に切り替えた設計段階で、次の 2 つの画像に示されているように、Size Inspect でラベルを変更して、「20 Hz」ラベルを上部ではなく下部にバインドしました。どちらの場合も原点は左上にあることに注意してください。

ここに画像の説明を入力 ここに画像の説明を入力

これにより、center プロパティの動作が変更され、次の行が生成されます。

ここに画像の説明を入力

ここでは、デモンストレーションのために UILabel を再配置しました。行の終わりは、ラベルの上部の中央にある必要があることに注意してください。

ここに画像の説明を入力

ラベルの中心点を印刷しました。いったん上部にバインドされ、再び下部にバインドされます。

上にバインド {290, 326.5}

下にバインド {290, 370.5}

origin.y を使用してそこからオフセットを行うことで回避策を試みましたが、同じタイプの効果があります。

完成したらこのように見えるようにしたいのですが、背の高い iPhone 5 の画面では次のようになります。

ここに画像の説明を入力


編集: @ott の要求に応じて、線の終点を計算するコード スニペットを追加します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGPoint begin = self.frequencyMaxLabel.center;
    begin.y += self.frequencyMaxLabel.frame.size.height/2.0;

    CGPoint end = self.frequencyMinLabel.center;
    end.y -= self.frequencyMinLabel.frame.size.height/2.0;

    // This is an object of two CGPoints to represent a line
    VWWLine* frequenciesLine = [[VWWLine alloc]
                                initWithBegin:begin
                                andEnd:end];

    // Pass the line to a UIView subclass where it is drawn
    [self.configView setLineFrequencies:frequenciesLine];
    [frequenciesLine release];

    // .... other code truncated for example
}

そして、線を引くコード (上記のスニペットの UIView サブクラス、self.configView 内)

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

    CGContextBeginPath(cgContext);
    CGContextSetLineWidth(cgContext, 2.0f);

    CGFloat yellowColor[4] = {1.0, 1.0, 0.0, 1.0};

    CGContextSetStrokeColor(cgContext, yellowColor);
    [self drawLineWithContext:cgContext
                    fromPoint:self.lineFrequencies.begin
                      toPoint:self.lineFrequencies.end];
    CGContextStrokePath(cgContext);

    //...... truncated. Draw the other lines next
}
4

1 に答える 1

1

viewDidLoadシステムが現在のデバイスとインターフェイスの向きのビューをレイアウトする前に、メッセージを受け取ります。そのコードを に移動しますviewDidLayoutSubviews

また、チェックアウトすることもできますCAShapeLayer

于 2012-12-30T04:48:35.160 に答える