我为用户输入制作了一个很酷的自定义数字键盘。它由4 UIButtons
内的12 UIStackView
3组成,它们本身嵌套在父UIStackView
中。我希望按钮是圆形的。期望的外观是这样的:
以下是围绕角落的代码:
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];
问题在于,当我将此代码放入viewDidLoad
或viewWillAppear
时,按钮看起来像这样:
除非我将代码放在viewDidAppear
中,否则全圆形按钮不会显示。但是在渲染圆圈之前会有明显的延迟。
有人知道造成这种奇怪行为的原因是什么吗?我想知道它是否与UIStackViews
本身有关,因为我遇到了其他问题。
使用Xcode 7.3.1和El Capitan 10.11.3
修改
我在@Murat Tezyapar下面的答案中尝试了这个建议,但是代码没有在viewDidLayoutSubviews中调用,也没有在viewWillLayoutSubviews中调用(我觉得值得一试......)。我做了一些NSLogging,发现只有代码在viewDidAppear中执行时,按钮才能达到适当的大小(70分)。如上所述,圆圈仍然在按钮本身以及其他所有内容后呈现。
答案 0 :(得分:2)
这可能是因为在触发viewWillAppear和viewDidLoad时尚未设置视图的框架。 viewDidLayoutSubviews是一个很好的地方,因为所有约束都被考虑在内,并且根据你的约束调整了视图。您似乎尝试访问viewDidLoad上的按钮帧并获取其初始值(例如:20 px宽度和高度),当它应该是viewDidLayoutSubviews上的50 px时。
所以当您设置角半径时:
button.layer.cornerRadius = (button.frame.size.width)/2.0f;
您无法获得正确的帧宽,因此在50像素宽度按钮上设置10.0角半径。
结论:
如果您正在使用自动布局,请使用viewDidLayoutSubviews。