【问题标题】:How properly calculate cornerRadius depending on the button frame如何根据按钮框架正确计算cornerRadius
【发布时间】: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;为除法设置一些任意数字,您将按比例获得角落收音机。

标签: ios swift uibutton swift3


【解决方案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(完全圆角)之间的任意数字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多