【问题标题】:ULabel's center property's value changes depending on which edge it's bound toULabel 的 center 属性值根据绑定到的边缘而变化
【发布时间】:2012-12-14 09:57:13
【问题描述】:

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

详细说明: 我在这样的两个标签之间画一条线(黄线):

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

这会改变 center 属性的行为,因此会产生以下行:

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

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

绑定到顶部 {290, 326.5}

绑定到底部 {290, 370.5}

我尝试了一种解决方法,方法是使用 origin.y 并从那里进行偏移,但这具有相同类型的效果。

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


编辑:根据@ott 的要求,添加代码 sn-p 计算线的端点

- (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 子类中,来自 sn-p 上方的 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
}

【问题讨论】:

  • 在视图控制器的生命周期中,您在什么时候获得了UILabel 的中心?
  • 你能显示标签和线条的计算吗?
  • @bobnoble,我得到了 UIViewController 的 viewDidLoad 方法的中心点。
  • @ott,我无法在此处添加代码,因此我编辑了原始代码。查看底部,您将看到两个 sn-ps。第一个来自 UIViewController,它计算绘制线的点。这些点被滚动到一个objective-c 类中以便更容易地表示一条线,然后传递到一个UIView 子类,这是覆盖drawRect 的适当位置,这是我使用CoreGraphics 绘制线的地方。如果您需要更多详细信息,请告诉我。
  • 必须是标签的自动排列。你能把它关掉吗?我不使用 IB,而是将标签放在代码中,然后在它们之间画线。

标签: iphone ios interface-builder iphone-5


【解决方案1】:

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

另外,您可能想查看CAShapeLayer

【讨论】:

  • 你的想法是对的。根据您的输入和@bobnoble 的输入,我将代码移至 viewDidAppear 并成功!奇迹般有效。完美的!谢谢大家。
猜你喜欢
  • 1970-01-01
  • 2014-04-13
  • 2022-01-13
  • 2019-05-08
  • 2016-11-29
  • 1970-01-01
  • 2015-06-08
  • 2018-11-03
  • 2012-11-12
相关资源
最近更新 更多