当实际中心向外看时,UILabel以可视方式居中于它的超视图

时间:2015-05-07 23:27:06

标签: ios objective-c uilabel sizetofit

我有一个容器UIView和一个UILabel。设置了容器视图大小,然后我将文本添加到UILabel,在标签上调用sizeToFit,并将标签添加为容器视图的子视图。

然后我使用以下代码将标签置于容器视图中心:

viewCountLabel.frame = CGRectMake(viewCountContainer.frame.size.width/2 - viewCountLabel.frame.size.width/2, viewCountContainer.frame.size.height/2 - viewCountLabel.frame.size.height/2, viewCountLabel.frame.size.width, viewCountLabel.frame.size.height);

这是非常标准的代码,可以将内容集中到它的superview /容器上,而且它总能很好地工作。

但是,现在我有一个小问题。此标签的文字是一个简单的数字。它可以是1,9,15,22等。

我的问题是,当我把所有内容都集中在一起时,即使它们在技术上完全居中,一些数字也会偏离中心。

这是一个带有容器和标签边框的示例照片,因此您可以看到它们完美居中:

enter image description here

但是这里看起来没有边界:

enter image description here

15看起来并不像它在中心,即使它在技术上也是如此。它看起来有点太偏右了。如果我从x值中减去2或3,它将在视觉上显示居中,但看到问题。

如何设置逻辑到视觉中心"这样的标签的各种价值?我觉得根据文本值设置一堆if语句是过度的,只是对问题应用了一个bandaid。

我也尝试使用NSTextAlignmentCenter,这没有什么区别。我不确定我是否错误地使用NSTextAlignmentCenter,或者sizeToFit是否存在潜在问题。

您会注意到该标签的蓝色边框在所有侧面都有额外的空间,但最重要的是,对于这个问题,它在左侧和右侧有额外的空间。我觉得这可能会导致这个问题,但我不确定如何解决这个问题,或者甚至是问题。

这是我的代码:

// Setup view count label container
UIView *viewCountContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 95, 95)];
viewCountContainer.frame = CGRectMake(self.view.frame.size.width/2 - viewCountContainer.frame.size.width/2, 87, viewCountContainer.frame.size.width, viewCountContainer.frame.size.height);


// Setup + add number label to container
UILabel *viewCountLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.pushModal.frame.size.width, 95)];
viewCountLabel.textAlignment = NSTextAlignmentCenter;
viewCountLabel.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:72];
viewCountLabel.textColor = [UIColor colorWithRed:0.278 green:0.278 blue:0.278 alpha:1];
viewCountLabel.text = [NSString stringWithFormat:@"%d", viewCount];
[viewCountLabel sizeToFit];

// Center the label to it's super view (viewCountContainer)
viewCountLabel.frame = CGRectMake(viewCountContainer.frame.size.width/2 - viewCountLabel.frame.size.width/2, viewCountContainer.frame.size.height/2 - viewCountLabel.frame.size.height/2, viewCountLabel.frame.size.width, viewCountLabel.frame.size.height);

[viewCountContainer addSubview:viewCountLabel];
[self.view addSubview:viewCountContainer];

2 个答案:

答案 0 :(得分:0)

不幸的是,没有完美的"这样做的方式。我已经在标签上添加了字符间距,尝试将其宽度设置为superview的宽度和居中等,但是你永远无法动态地执行此操作并以这种方式完善它。 / p>

我每次都能看到完美的唯一方法就是先制作UILabel,然后以编程方式围绕它绘制一个圆圈,然后将标签居中。

为每个数字添加逻辑或以这种方式在视觉上居中的那种或者难的方式。

答案 1 :(得分:0)

可以将monospacedDigitSystemFont(ofSize:weight:)textAlignment = .center组合使用来居中