为什么我的UILabel不居中?

时间:2012-04-08 00:51:37

标签: iphone objective-c ios cocoa-touch

我试图将UILabel水平居中。这就是最终看起来的样子(注意它没有中心)。

enter image description here

    ReflectionView *aReflectionView = [[ReflectionView alloc]initWithFrame:CGRectMake(((self.view.bounds.size.width / 2) - 150), 40, 300, 90)];
    UILabel *aLabel = [[UILabel alloc]initWithFrame:CGRectMake(((self.view.bounds.size.width / 2) - 150), 0, 300, 90)];
    aLabel.textAlignment = UITextAlignmentCenter;
    aLabel.text = @"1 lbs";
    self.weightLabel = aLabel;
    [aReflectionView addSubview:self.weightLabel];
    self.weightReflectionView = aReflectionView;
    [self.view addSubview:self.weightReflectionView ];
    [self.weightReflectionView  updateReflection];

4 个答案:

答案 0 :(得分:7)

textAlignment属性会在UILabel的框架内对齐文字,而不是在|之外。我的ASCII技能有点生疏,但这就是我的意思。考虑下面的标签,其中[]表示标签的左/右边缘。

|173 lbs    | => left aligned
|    173 lbs| => right aligned
|  173 lbs  | => center aligned (not exactly centered in terms of its superview)

现在考虑另一个视图中包含的相同标签,其中外部|表示包含视图的边缘,内部textAlignment表示包含标签的边缘。注意内部标签在其超视图中是不是完全居中,并且稍微向右推(左边2个空格,右边靠近1个空格)。

[  |173 lbs    | ] => left aligned
[  |    173 lbs| ] => right aligned
[  |  173 lbs  | ] => center aligned

如果您希望标签始终在超视图或屏幕中居中对齐,您可能需要确保标签的宽度与其容器匹配,然后将bounds设置为居中。方法如下:

[|173 lbs      |] => left aligned
[|      173 lbs|] => right aligned
[|   173 lbs   |] => center aligned (perfectly aligned)

这是一种常见情况,您希望子视图与超视图的确切大小相匹配。您可以使用ReflectionView *aReflectionView = [[ReflectionView alloc] initWithFrame:..]; // Use the bounds of the superview to set the subview's frame. UILabel *aLabel = [[UILabel alloc] initWithFrame:aReflectionView.bounds]; 属性轻松完成此操作。

{{1}}

作为一个UI调试技巧,尝试更改有问题的视图(标签)的背景,以准确显示它正在采取的区域,这通常有助于解决许多此类问题。

答案 1 :(得分:2)

仅出于调试目的,请尝试设置backgroundColoraLabel的{​​{1}}以查看它们的放置位置。

aReflectionView

您应该会看到aLabel.backgroundColor = [UIColor redColor]; aReflectionView.backgroundColor = [UIColor blueColor]; 在其超级视图中正确居中,但其中包含的aReflectionView则不是。为什么不?因为这一行:

aLabel

由于UILabel *aLabel = [[UILabel alloc]initWithFrame:CGRectMake(((self.view.bounds.size.width / 2) - 150), 0, 300, 90)]; 中包含aLabel,因此它应位于aReflectionView范围内,而不是aReflectionView的范围内。向右滚动以查看更改:

self.view

出于您的目的,最好让UILabel *aLabel = [[UILabel alloc]initWithFrame:CGRectMake(((aReflectionView.bounds.size.width / 2) - 150), 0, 300, 90)]; 填充aLabel

aReflectionView

答案 2 :(得分:0)

问题不在于UILabel中文本的对齐,而在于UILabel本身的对齐。具体来说,你是根据self.view的宽度(特别是宽度)创建UILabel中心对齐,但是你将它添加到aReflectionView(它更窄,偏离自我的左边缘)。查看,并已在屏幕中心)。在这种情况下,净效果是你从self.view的左边缘获得两次偏移,一次在aReflectionView的x坐标中,然后再次在你放入的aLabel的x坐标中aReflectionView,显然不是你的意图。最简单的解决方法可能是:

UILabel *aLabel = [[UILabel alloc] initWithFrame:CGRectMake(((aReflectionView.bounds.size.width / 2) - 150), 0, 300, 90)];

底线,将标签置于您正在放置的视图上。

答案 3 :(得分:0)

对于那些谷歌搜索,我有他们的答案。问题是,我有一些转义字符在代码中指定一个新行,如下所示:

self.emptyLabel.text = @"No likes yet! \n\
\
\n(Like some cards to save them here)";

这导致文本偏离中心。只需将它们删除即可:

self.emptyLabel.text = @"No likes yet! \n\n(Like some cards to save them here)";