重用UITextField值来控制仪表的弧长
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重用UITextField值来控制仪表的弧长相关的知识,希望对你有一定的参考价值。
我正在创建3个包含UITextField的半圆形量规。
我为每个仪表创建了单独的swift文件(带有自己的UIView类),我以编程方式设计构成仪表的弧形外观(段线等)。其中一个弧形就像一个指针,显示从空到满的任何地方(startAngle
是149°到endAngle
,它是31°)。我正在使用@IBOutlet
访问字段值(声明它main1Field
),但我必须使用CGFloat,我无法弄清楚如何声明一个常量,其中值可以在函数中使用。
Q1:将UITextField
中的任何内容转换为可在我的函数中计算的值的方法是什么?
Q2:我不想用main1Field
输入直接绘制弧线。我希望你可以看到使用@IBAction
,以便当用户在场中输入一个数字时,实时绘制弧。我这样做的方式并不奏效。
@IBAction func main1arc(_ sender: UITextField) { //THIS DOESN'T WORK
func draw(_ rect: CGRect) {
let center = CGPoint(x: bounds.width / 2, y: bounds.height / 2)
let radius: CGFloat = max(bounds.width, bounds.height)
//Arc
let fullTank = 3920
let main1Fuel = CGFloat(self.main1Field) //THIS IS WHERE I NEED HELP
let startAngle = (149 * CGFloat.pi) / 180
let endAngle = (31 * CGFloat.pi) / 180
let angleDifference: CGFloat = 2 * .pi - startAngle + endAngle
let arcLength = angleDifference / CGFloat(fullTank)
let arcEnd = arcLength * CGFloat(main1Fuel) + startAngle
let arc = UIBezierPath(arcCenter: center,
radius: radius / 2 - Constants.arcWidth / 2,
startAngle: startAngle,
endAngle: arcEnd,
clockwise: true)
答案
有两个问题:
- 您可以使用UITextFieldDelegate方法shouldChangeCharactersInRange或target action来通知textField中的更改。
- 如果有更改,请将textField.text值转换为Double,然后将Double转换为CGFloat。 (CGFloat没有字符串初始化程序)。
目标操作示例.editingChanged:
class ViewController: UIViewController {
let textField = UITextField()
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
let stack = UIStackView(frame: CGRect.init(x: 0, y: 100, width: 300, height: 60))
textField.backgroundColor = .white
label.backgroundColor = .gray
stack.addArrangedSubview(textField)
stack.addArrangedSubview(label)
stack.axis = .vertical
stack.distribution = .fillEqually
view.addSubview(stack)
textField.becomeFirstResponder()
textField.addTarget(self, action: #selector(edit), for: .editingChanged)
}
@objc private func edit() {
guard let floatValue = textField.text.flatMap({Double($0)}).map({CGFloat($0)}) else {
label.text = "Not a valid CGFloat"
return
}
label.text = "Valid float value: (floatValue)"
}
}
以上是关于重用UITextField值来控制仪表的弧长的主要内容,如果未能解决你的问题,请参考以下文章