Повторно используйте значение UITextField для управления длиной дуги датчика - PullRequest
0 голосов
/ 03 декабря 2018

Я создаю 3 полукруглых датчика, каждый из которых содержит UITextField.

Я создал отдельные быстрые файлы (со своими собственными классами 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)

1 Ответ

0 голосов
/ 04 декабря 2018

Есть две проблемы:

  1. Вы можете использовать метод UITextFieldDelegate shouldChangeCharactersInRange или target 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)"
    }
}
...