如何根据按钮框架正确计算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】:试试这个代码:
btn1
、btn2
和 btnarrival
是 UIButton
实例:
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 的最佳位置?