如何根据按钮框架正确计算cornerRadius

Posted

技术标签:

【中文标题】如何根据按钮框架正确计算cornerRadius【英文标题】:How properly calculate cornerRadius depending on the button frame 【发布时间】:2016-10-06 10:17:39 【问题描述】:

如何根据按钮的边框计算cornerRadius属性以创建圆角。

我不喜欢为每个按钮项重新定义每个时间角cornerRadius

我为UIButton 创建扩展。

extension UIButton 

    func setRoundedCorners()
        self.layer.cornerRadius = 10
        self.layer.borderWidth = 1
    


我想知道每次我使用这个函数时如何动态计算cornerRadius

主要问题是找到可以为不同按钮尺寸计算 .cornerRadius 的函数。下面的示例将显示小的差异。

例子:

圆角半径为 10:

:

圆角半径为 15:

是否有可能找到一个函数来计算给出角半径的正确值?

【问题讨论】:

你需要什么样的按钮给我UI我会给你代码.. 获得灵活函数的主要思想,该函数将根据不同按钮的框架计算适当的角半径 但是你想要什么样的形状,比如圆形还是圆角? 是的,只是圆角 self.layer.cornerRadius = self.frame.size.height/0.5;为除法设置一些任意数字,您将按比例获得角落收音机。 【参考方案1】:

这个扩展可以帮助你——它根据frame 属性计算和设置给定UIView 实例的角半径:

extension UIView 
    /**
     Magically computes and sets an ideal corner radius.
     */
    public func magicallySetCornerRadius() 
        layer.cornerRadius = 0.188 * min(frame.width, frame.height)
        layer.masksToBounds = true
    

这是我在“ViewController.swift”文件中为三个不同大小的UIButtons 使用它的方法:

import UIKit

class ViewController: UIViewController 

    private func addButton(frame: CGRect, backgroundColor: UIColor) 
        let button = UIButton(frame: frame)
        button.backgroundColor = backgroundColor
        button.magicallySetCornerRadius()
        button.layer.borderColor = UIColor.black.cgColor
        button.layer.borderWidth = 1.0
        view.addSubview(button)
    

    override func viewDidLoad() 
        super.viewDidLoad()
        addButton(frame: CGRect(x: 40.0, y: 100.0, width: 100.0, height: 300.0), backgroundColor: .blue)
        addButton(frame: CGRect(x: 160.0, y: 180.0, width: 100.0, height: 100.0), backgroundColor: .green)
        addButton(frame: CGRect(x: 160.0, y: 300.0, width: 180.0, height: 100.0), backgroundColor: .red)
        addButton(frame: CGRect(x: 40.0, y: 420.0, width: 300.0, height: 150.0), backgroundColor: .yellow)
    


...这就是结果的样子:

【讨论】:

【参考方案2】:

试试这个代码:

btn1btn2btnarrivalUIButton 实例:

 btn1.setCornerRadius()
 btn2.setCornerRadius()
 btnarrival.setCornerRadius()


extension UIButton 
    func setCornerRadius() 
        layer.cornerRadius = frame.size.height / 2.0
        clipsToBounds = true
    

【讨论】:

我的这段代码有什么问题。谁让我投反对票,请澄清。 在我的代码中,如果你想减少cornerRadius,那么只需简单地除以3,这样你的cornerRadius就会减少..如果你同意我的观点,那就投票吧。 代码的质量很糟糕。名称违反所有样式规则。 (instance) 方法实际上并不接触实例,而是传递的参数。参数的类型无缘无故地被隐式解包。等等…… 另外,我不认为推动人们投票是获得 SO 代表的正确方式。 好的,谢谢你的建议@NikolaiRuhe,如果你不介意的话,请用你的风格编写相同的函数,这样我就可以得到一个新的风格来编写一个好的函数。【参考方案3】:

获得能够正确计算的灵活函数的主要思想 基于框架的不同按钮的圆角半径

我认为这取决于你作为参数传递的内容:

extension UIButton 
    func setRoundedCorners(ratio: Double?) 
        if let r = ratio 
            self.layer.cornerRadius = self.frame.size.width*r // for specific corner ratio                            
         else 

            // circle
            // i would put a condition, as width and height differ:
            if(self.frame.size.width == self.frame.size.height) 
                self.layer.cornerRadius = self.frame.size.width/2 // for circles
             else 
                //
            
        
        self.layer.borderWidth = 1
    

用法

let button = UIButton()
button.setRoundedCorners(ratio: 0.25) // shape with rounded corners
button.setRoundedCorners() // circle

【讨论】:

是否可以编写函数来根据按钮的框架计算这个比率 函数计算圆角半径错误的问题。 如果有人自动对人们的回答投反对票,会有人愿意回答这个问题吗? 但我不会对这个问题投任何票,这是不好的做法 我同意你@pedrouan【参考方案4】:

我一直在寻找同样的东西,并发现自己是一个非常清晰和简单的解决方案。由于它是 UIView 的扩展,因此您不仅可以在按钮上使用它,还可以在多个对象上使用它。

extension UIView
    func cornerCalculation(r: CGFloat) 
        self.layer.cornerRadius = self.frame.height/2 * r
    

然后只需调用:

button.cornerCalculation(r: 1)

r 可以是 0(锐边)和 1(完全圆角)之间的任意数字

【讨论】:

以上是关于如何根据按钮框架正确计算cornerRadius的主要内容,如果未能解决你的问题,请参考以下文章

根据子类中的 UIButton 大小设置cornerRadius 的最佳位置?

为不同尺寸的屏幕获取正确的cornerRadius的问题

如何在按钮边缘上制作cornerRadius,以便在swiftUI中不剪裁边缘

分配框架的正确方法

在按钮模板上设置CornerRadius

如何根据时间戳值计算子列表的平均值?