尽管角半径是高度的一半,但 UIButton 未正确舍入

UIButton Not Rounding Correctly despite corner radius being half the height

我正在开发一个屏幕,该屏幕基本上允许用户为他们的个人资料输入一些信息。此屏幕上有一个按钮,用户可以使用该按钮 select 他们的性别。我想将这些按钮设置为圆形,因此为了实现这一点,我将这些按钮的 cornerradius 设置为它们高度的一半。要进入此屏幕,有两种方法,一种是创建个人资料,第二种是编辑个人资料。问题是,当您创建配置文件时,UIButton 会被挤压并且无法正确舍入,但是当我编辑我的配置文件时它会正确舍入,即使它是完全相同的代码,唯一的区别是当您打开时编辑个人资料的屏幕,我启用导航栏。

我用来圆按钮的代码在这里:

        maleButton.layer.borderColor = maleButtonColor.cgColor
        maleButton.setTitleColor(maleButtonColor, for: .normal)
        maleButton.layer.cornerRadius = maleButton.frame.size.height / 2

这发生在调用的函数中:viewDidLayoutSubviews()

这些按钮的区别如下图所示: 注意** 这些是完全相同的按钮,唯一不同的是在第二张图片中背景颜色已更改,以表明用户已经 select 编辑了该按钮,因为他们正在编辑他们的个人资料。

我打印出了按钮的高度、宽度和圆角半径:

当它不起作用时,这里的值是:

当它在这里工作时,值是:

如您所见,在这两种情况下,拐角半径恰好是高度的一半,因此它应该是正确的四舍五入,但事实并非如此。这很奇怪,因为它在工作和不工作的不同情况下是完全相同的代码和相同的视图控制器。这个问题一直困扰着我,所以希望有人能帮助阐明它。谢谢!

@Wana_B3_Nerd造成这个原因的主要原因是你的身高比例。 viewDidLoadviewWillAppear 总是在情节提要中给出高度设置。在 viewDidAppear: 中,您将始终获得更新的框架。您可以通过多种方式解决此问题。我在建议我知道的方法。

  1. viewDidAppear:方法中编写代码

  2. 如果 viewDidAppear: 不适用并且您希望在 viewDidLoad 中执行代码,则在主调度队列中添加代码

     DispatchQueue.main.async {
         // your code
     }
    
  3. 子类化 UIButton 并在 drawRect 方法中添加您的代码。

     class RoundButton: UIButton {
    
         override func draw(_ rect: CGRect) {
              // Your code
          }   
    
     }