クイック バージョン: 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
}