ULabel的中心属性的值根据它所绑定的边缘而变化

时间:2012-12-29 11:42:51

标签: iphone ios interface-builder iphone-5

快速版:为什么UILabel的“中心”属性的值在它的大小属性被绑定到它的父容器的顶部和底部之间时会发生变化,我该怎么做才能更改或绕过那种行为?

包含详细信息的长版 我在两个标签之间划线(黄线):

enter image description here

要计算线路的终点,我使用UILabels的中心属性(在此照片中标签表示2.5kHz和20 Hz),然后是标签高度的+或 - 一半。这项技术在下面的示例/图片中效果很好。然而,在我将屏幕尺寸切换到iPhone5(更高)的设计阶段,我通过在尺寸检查中更改它将“20 Hz”标签绑定到底部而不是顶部,如下图所示。请注意,在两种情况下,原点仍然位于左上角:

enter image description here enter image description here

这会改变center属性的行为方式,从而生成以下行:

enter image description here

我在这里重新安置UILabel只是为了演示。请注意,该行的末尾应位于标签顶部的中心:

enter image description here

我打印了标签的中心点。一旦绑定到顶部,再次到底部:

绑定到顶部 {290,326.5}

绑定到底部 {290,370.5}

我尝试使用origin.y并从那里做偏移,但是它具有相同类型的效果。

我希望它在完成时看起来像这样,但是在更高的iPhone 5屏幕上:

enter image description here


编辑:根据@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
}

1 个答案:

答案 0 :(得分:1)

在系统为当前设备和界面方向布置您的视图之前,您会收到viewDidLoad消息。将该代码移至viewDidLayoutSubviews

另外,您可能需要查看CAShapeLayer