UIStackView

时间:2016-06-19 17:40:05

标签: ios objective-c rounded-corners uistackview

我为用户输入制作了一个很酷的自定义数字键盘。它由4 UIButtons内的12 UIStackView 3组成,它们本身嵌套在父UIStackView中。我希望按钮是圆形的。期望的外观是这样的:

enter image description here

以下是围绕角落的代码:

for (UIStackView *subStack in self.mainStackView.arrangedSubviews)
{
    for (UIButton *button in subStack.arrangedSubviews)
    {
        button.layer.borderWidth = 1.0f;
        button.layer.borderColor = [[UIColor orangeColor] CGColor];
        button.layer.cornerRadius = (button.frame.size.width)/2.0f;
        button.layer.masksToBounds = YES;
        button.clipsToBounds = YES;
        [button setShowsTouchWhenHighlighted:YES];
        NSLog(@"button.tag = %ld", (long)button.tag);
    }
}
[self.view setNeedsLayout];

问题在于,当我将此代码放入viewDidLoadviewWillAppear时,按钮看起来像这样:

enter image description here

除非我将代码放在viewDidAppear中,否则全圆形按钮不会显示。但是在渲染圆圈之前会有明显的延迟。

有人知道造成这种奇怪行为的原因是什么吗?我想知道它是否与UIStackViews本身有关,因为我遇到了其他问题。

使用Xcode 7.3.1和El Capitan 10.11.3

修改

我在@Murat Tezyapar下面的答案中尝试了这个建议,但是代码没有在viewDidLayoutSubviews中调用,也没有在viewWillLayoutSubviews中调用(我觉得值得一试......)。我做了一些NSLogging,发现只有代码在viewDidAppear中执行时,按钮才能达到适当的大小(70分)。如上所述,圆圈仍然在按钮本身以及其他所有内容后呈现。

1 个答案:

答案 0 :(得分:2)

这可能是因为在触发viewWillAppear和viewDidLoad时尚未设置视图的框架。 viewDidLayoutSubviews是一个很好的地方,因为所有约束都被考虑在内,并且根据你的约束调整了视图。您似乎尝试访问viewDidLoad上的按钮帧并获取其初始值(例如:20 px宽度和高度),当它应该是viewDidLayoutSubviews上的50 px时。

所以当您设置角半径时:

button.layer.cornerRadius = (button.frame.size.width)/2.0f;

您无法获得正确的帧宽,因此在50像素宽度按钮上设置10.0角半径。

结论:

如果您正在使用自动布局,请使用viewDidLayoutSubviews。