【发布时间】: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