1

我正在尝试将我的 UILabel 水平居中。这就是它最终的样子(注意它没有中心)。

在此处输入图像描述

    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

4 回答 4

7

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

|173 磅 | => 左对齐
| 173 磅| => 右对齐
| 173 磅 | => 居中对齐(就其父视图而言并不完全居中)

现在考虑包含在另一个视图中的相同标签,其中外部[]表示包含视图的边缘,内部|表示包含标签的边缘。请注意内部标签如何在其父视图中不完全居中,并且略微向右推(距左侧 2 个空格,距右侧 1 个空格)。

[ |173 磅 | ] => 左对齐
[ | 173 磅| ] => 右对齐
[ | 173 磅 | ] => 居中对齐

如果您希望标签始终在超级视图或屏幕中居中对齐,则需要确保标签的宽度与其容器匹配,然后设置textAlignment为居中。就是这样:

[|173 磅 |] => 左对齐
[| 173 磅|] => 右对齐
[| 173 磅 |] => 居中对齐(完全对齐)

这是您希望子视图与父视图的确切大小相匹配的常见情况。您可以使用该bounds属性轻松地做到这一点。

ReflectionView *aReflectionView = [[ReflectionView alloc] initWithFrame:..];
// Use the bounds of the superview to set the subview's frame.
UILabel *aLabel = [[UILabel alloc] initWithFrame:aReflectionView.bounds];

作为 UI 调试提示,尝试更改有问题的视图(标签)的背景以准确显示它所占用的区域,这通常有助于解决许多此类问题。

于 2012-04-08T01:03:14.007 回答
2

仅出于调试目的,尝试设置backgroundColorofaLabelaReflectionView查看它们的放置位置。

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

UILabel *aLabel = [[UILabel alloc]initWithFrame:aReflectionView.bounds];
于 2012-04-08T01:18:57.550 回答
0

问题不在于 UILabel 中文本的对齐方式,而在于 UILabel 本身的对齐方式。具体来说,您正在创建 UILabel 以根据 self.view 的宽度(特别是宽度)居中对齐,但您将其添加到 aReflectionView (较窄,从 self.view 的左边缘偏移)。视图,并且已经在屏幕上居中)。在这种情况下,最终效果是您从 self.view 的左边缘获得了两次偏移,一次是在 aReflectionView 的 x 坐标中,然后是在您放入的 aLabel 的 x 坐标中aReflectionView,这显然不是你的意图。最简单的修复可能是这样的:

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

底线,将标签居中放置在您要放置的视图上。

于 2012-04-08T01:24:26.917 回答
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)";
于 2015-02-23T01:09:01.553 回答