Ios 使用viewDidLayoutSubviews()自动调整角半径在显示视图之前不更新视图
我不熟悉swift和Xcode,所以可能有一个简单的答案或更好的方法来实现这一点。我正在尝试在所有大小的iOS设备中为我的按钮制作圆角,目前为止,我找到的最佳方法是使用此方法:Ios 使用viewDidLayoutSubviews()自动调整角半径在显示视图之前不更新视图,ios,swift,cornerradius,viewdidlayoutsubviews,Ios,Swift,Cornerradius,Viewdidlayoutsubviews,我不熟悉swift和Xcode,所以可能有一个简单的答案或更好的方法来实现这一点。我正在尝试在所有大小的iOS设备中为我的按钮制作圆角,目前为止,我找到的最佳方法是使用此方法: override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() for i in 0..<buttons.count { self.buttons[i].layer.cornerRadius = se
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
for i in 0..<buttons.count {
self.buttons[i].layer.cornerRadius = self.buttons[i].bounds.size.height / 2
}
examResultsBackButtonOutlet.layer.cornerRadius = examResultsBackButtonOutlet.bounds.size.height / 2
}
// Build UI
func loadUI() {
// Round the edges, change color background, font
titleOutlet.mainMenuStyle("", 75, earthGreenWithAlpha)
for i in 0..<buttons.count {
buttons[i].mainMenuStyle("", 40)
}
print("Main Menu successful load")
}
问题不是在我第一次启动应用程序时出现的(这是第一个场景/视图控制器),而是在我从第二个视图控制器切换回该场景时出现的
发生的情况是,按钮的格式奇怪了大约半秒钟,然后它们被完全重新格式化:
您会注意到第二张图像(仅出现约0.5秒)的角半径要大得多
我如何才能防止这种情况发生,让用户只看到每个按钮的完美圆角半径,而不是可怜的janky按钮
谢谢 也许你可以试试这个: 或添加到UIView的扩展
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
layer.masksToBounds = (newValue > 0)
}
}
}
感谢大家的反馈,但以下是为我解决问题的方法:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
for i in 0..<buttons.count {
self.buttons[i].layer.cornerRadius = self.buttons[i].bounds.size.height / 2
}
examResultsBackButtonOutlet.layer.cornerRadius = examResultsBackButtonOutlet.bounds.size.height / 2
}
覆盖函数视图显示(uu动画:Bool){
super.viewdide显示(动画)
对于0中的我..谢谢,但我已经尝试过了。我尝试过通过将viewDidLoad()函数中的方法放入ViewWillAspect()来设置UI更改函数,但我得到了与以前相同的结果。如果我将ViewDidLayoutViews函数移动到viewWillApper,它不会环绕按钮的边缘。如果我错了,请纠正我,但viewDidLoad发生在ViewWillayout出现之前,因此设置我的UI更改越快越好,因为ViewDidLayoutSubView需要引用UIanges更新圆角的UI。最初不会调用didLayoutSubview,只有在添加或删除子视图时才会调用它。在这种情况下,我认为在将堆栈视图设置为隐藏时可能会调用它。您可以尝试将LayoutSubView中的代码移动到ViewDidLoad。非常感谢。好的,我刚刚尝试过。我尝试过了它有两种方法…1)此方法仍然存在:重写func viewdilayoutsubviews(){super.viewdilayoutsubviews()}2)没有这种方法。在这两种情况下,我的角都没有倒圆,它们仍然像我在原始帖子中所做的那样锯齿状。我不断地移动代码,我注意到只有在覆盖func viewdilayoutsubviews(){super.viewdilayoutsubviews()}中保留拐角半径修改时,角才会倒圆方法我不确定如何将按钮添加到视图中。是否通过编程添加了按钮,或者这些按钮仅位于故事板上。如果这些按钮位于故事板上,请尝试在故事板中设置运行时属性。按钮位于故事板上,并且位于stackview内部。我已为stac设置了约束kview为superview高度的80%(stackview.height=superview.height x 0.8)。然后,我通过IBOutlets更新代码中的属性。我不知道如何在不使用代码的情况下使故事板中的角变圆。这是更好的方法吗?是否有特定的原因使您以这种方式将角半径应用于这些按钮?我发现,当我应用角半径时,按钮的圆边随屏幕的不同而不同根据屏幕大小调整大小。这可能部分是由于我对它们施加了限制(它们不是固定高度,而是在堆栈视图内部,该堆栈视图的高度与superview相同,乘数为0.8,因此无论屏幕大小,基本上都是superview的80%).因此,由于屏幕大小不同,帧高度也不同,因此我需要更新布局。请参阅此帖子:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
for i in 0..<buttons.count {
self.buttons[i].layer.cornerRadius = self.buttons[i].bounds.size.height / 2
}
examResultsBackButtonOutlet.layer.cornerRadius = examResultsBackButtonOutlet.bounds.size.height / 2
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
for i in 0..<buttons.count {
self.buttons[i].layer.cornerRadius = self.buttons[i].bounds.size.height / 2
}
examResultsBackButtonOutlet.layer.cornerRadius = examResultsBackButtonOutlet.bounds.size.height / 2 }