有没有办法以圆形排列布局按钮?
Is there any way to layout buttons in circular arrangement?
我正在尝试在角落制作一个圆形按钮,当您按下它时,它周围会弹出 3 个按钮。当你按住别针时,就像 Pinterest 的菜单一样。我使用 UIBezierPath
进行了查找,但这不是我要查找的内容。我知道有 GitHub 个库,但我正在尝试从头开始。
这是我尝试从头开始制作的示例:
我想出了如何使用圆角半径制作圆形按钮。我有一个特定的功能,它将为按钮设置动画,但我不知道如何正确地让它们围成一圈。我使用了约束,但这更像是方形布局而不是圆形布局。
你说:
but I can't figure out how to properly get them in a circle.
这只是一个小三角函数,可以计算出新按钮的中心相对于现有按钮的位置。如果r是距圆心x的距离,y,圆i 的角度为 θᵢ,则 xᵢ = x + r * cos(θᵢ) 且 yᵢ = y + r * sin(θᵢ)。 (在这种排列中,角度以弧度为单位从 3 点开始,顺时针方向进行测量,或者向负方向逆时针方向进行测量。)
例如,如果使用约束:
let r: CGFloat = 150 // let's say you want center of the circles to be 150 points away from center of existing button
let range = -CGFloat.pi / 2 ... 0 // and we want the angles to range from -π/2 to 0
let howMany = 5 // and you want five of them
for i in 0 ..< howMany {
let angle = range.lowerBound + CGFloat(i) / CGFloat(howMany - 1) * (range.upperBound - range.lowerBound)
let offset = CGPoint(x: r * cos(angle), y: r * sin(angle))
let button = ...
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)
NSLayoutConstraint.activate([
button.centerXAnchor.constraint(equalTo: mainButton.centerXAnchor, constant: offset.x),
button.centerYAnchor.constraint(equalTo: mainButton.centerYAnchor, constant: offset.y),
button.widthAnchor.constraint(equalToConstant: 40),
button.heightAnchor.constraint(equalToConstant: 40)
])
}
我正在尝试在角落制作一个圆形按钮,当您按下它时,它周围会弹出 3 个按钮。当你按住别针时,就像 Pinterest 的菜单一样。我使用 UIBezierPath
进行了查找,但这不是我要查找的内容。我知道有 GitHub 个库,但我正在尝试从头开始。
这是我尝试从头开始制作的示例:
我想出了如何使用圆角半径制作圆形按钮。我有一个特定的功能,它将为按钮设置动画,但我不知道如何正确地让它们围成一圈。我使用了约束,但这更像是方形布局而不是圆形布局。
你说:
but I can't figure out how to properly get them in a circle.
这只是一个小三角函数,可以计算出新按钮的中心相对于现有按钮的位置。如果r是距圆心x的距离,y,圆i 的角度为 θᵢ,则 xᵢ = x + r * cos(θᵢ) 且 yᵢ = y + r * sin(θᵢ)。 (在这种排列中,角度以弧度为单位从 3 点开始,顺时针方向进行测量,或者向负方向逆时针方向进行测量。)
例如,如果使用约束:
let r: CGFloat = 150 // let's say you want center of the circles to be 150 points away from center of existing button
let range = -CGFloat.pi / 2 ... 0 // and we want the angles to range from -π/2 to 0
let howMany = 5 // and you want five of them
for i in 0 ..< howMany {
let angle = range.lowerBound + CGFloat(i) / CGFloat(howMany - 1) * (range.upperBound - range.lowerBound)
let offset = CGPoint(x: r * cos(angle), y: r * sin(angle))
let button = ...
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)
NSLayoutConstraint.activate([
button.centerXAnchor.constraint(equalTo: mainButton.centerXAnchor, constant: offset.x),
button.centerYAnchor.constraint(equalTo: mainButton.centerYAnchor, constant: offset.y),
button.widthAnchor.constraint(equalToConstant: 40),
button.heightAnchor.constraint(equalToConstant: 40)
])
}