【问题标题】:UIButton Not Rounding Correctly despite corner radius being half the height尽管角半径是高度的一半,但 UIButton 未正确舍入
【发布时间】:2020-11-23 03:35:54
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 有趣,您是否尝试在“创建”配置文件时禁用导航栏以查看是否会改变按钮的弯曲方式?
  • 我确实尝试过,它在那种情况下仍然有效,但在另一种情况下无效。
  • 还能用吗?我认为创建个人资料是失败的情况?
  • 不,我认为您读错了帖子,因为您可以看到导航栏在编辑而不是创建时已启用。所以我所做的是尝试在编辑时禁用栏,看看这是否会导致按钮被夹住,但它没有。
  • 好的,我认为这是原因,你能试试viewDidAppear:方法中的代码吗?视图确实出现了始终正确的框架。如果可行,我还可以为您提供其他方法。

标签: ios swift xcode uibutton uikit


【解决方案1】:

@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
          }   
    
     }
    

【讨论】:

  • 我只会在viewDidiAppear中做,在这个函数中做有什么缺点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多