繁体   English   中英

UIStackView中意外的舍入UIButton行为

[英]Unexpected rounded UIButton behavior inside UIStackView

我为用户输入做了一个很酷的自定义数字键盘。 它由12个UIButtons组成,每个UIStackView 3个都位于4个UIStackView ,它们本身嵌套在父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];

问题是,当我将此代码放入viewDidLoadviewWillAppear ,按钮如下所示:

在此处输入图片说明

除非我将代码放入viewDidAppear ,否则不会显示完整的圆形按钮。 但是在绘制圆圈之前会有明显的延迟。

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

使用Xcode 7.3.1和El Capitan 10.11.3

编辑

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

这可能是因为触发viewWillAppear和viewDidLoad时尚未设置视图的框架。 viewDidLayoutSubviews是一个好地方,因为考虑到了所有约束,并且此时根据您的约束调整了视图的大小。 看来您尝试在viewDidLoad上访问按钮框架并在viewDidLayoutSubviews处的初始值为50 px时获取其初始值(例如:20 px宽度和高度)。

因此,当您使用以下方法设置拐角半径时:

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

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

结论:

如果您使用的是自动布局,请使用viewDidLayoutSubviews。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM