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

问题描述 投票:0回答:2

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

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

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

这发生在一个被调用的函数中:

viewDidLayoutSubviews()

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

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

当它在这里不起作用时,值为:

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

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

ios swift xcode uibutton uikit
2个回答
4
投票

@Wana_B3_Nerd 造成这种情况的主要原因是你的身高比例。

viewDidLoad
viewWillAppear
始终给出故事板中设置的高度。在
viewDidAppear:
中,您将始终获得更新的框架。您可以通过多种方式解决此问题。我正在建议我所知道的方法。

  1. viewDidAppear:
    方法中编写代码

  2. 如果

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

     DispatchQueue.main.async {
         // your code
     }
    
  3. 子类化 UIButton 并在

    drawRect
    方法中添加代码。

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

0
投票

无需关心在代码中采取额外步骤的一种干净方法是对按钮进行子类化并执行以下操作:

            public class CapsuleButton: UIButton {
                
                public override func setNeedsLayout() {
                    super.setNeedsLayout()
                    layer.cornerRadius = bounds.height/2
                }

                required public init?(coder aDecoder: NSCoder) {
                    super.init(coder: aDecoder)
                    layer.masksToBounds = true
                }
            }

无论如何,您都可能对 UIButton 进行子类化,以保持整个应用程序的外观和感觉。

© www.soinside.com 2019 - 2024. All rights reserved.