Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用viewDidLayoutSubviews()自动调整角半径在显示视图之前不更新视图_Ios_Swift_Cornerradius_Viewdidlayoutsubviews - Fatal编程技术网

Ios 使用viewDidLayoutSubviews()自动调整角半径在显示视图之前不更新视图

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

我不熟悉swift和Xcode,所以可能有一个简单的答案或更好的方法来实现这一点。我正在尝试在所有大小的iOS设备中为我的按钮制作圆角,目前为止,我找到的最佳方法是使用此方法:

    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 }