2

快速版本:为什么 UILabel 的“中心”属性的值在它的大小属性绑定到其父容器的顶部和底部时会发生变化,我可以做些什么来改变或绕过这种行为?

带有详细信息的长版: 我在这样的两个标签之间画一条线(黄线):

在此处输入图像描述

为了计算线的端点,我使用了 UILabels 的 center 属性(在这张照片中,标签说 2.5kHz 和 20Hz),然后是标签高度的 + 或 - 一半。这种技术在下面的示例/图片中效果很好。然而,在我将屏幕尺寸切换为 iPhone5(更高)的设计阶段,我将“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 回答