重用UITextField值来控制仪表的弧长

问题描述 投票:0回答:1

我正在创建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)
swift uitextfield ibaction
1个回答
0
投票

有两个问题:

  1. 您可以使用UITextFieldDelegate方法shouldChangeCharactersInRangetarget action来通知textField中的更改。
  2. 如果有更改,请将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)"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.