#ios #swift #uigesturerecognizer
Вопрос:
Я добавил распознаватель жестов панорамирования в проект iOS. Его цель состоит в том, чтобы позволить пользователю изменять значение с плавающей точкой в поле UIText путем перетаскивания влево и вправо. Это работает нормально, и единственное, что он делает, — это обновляет содержимое поля UIText, к которому он прикреплен. Никаких манипуляций с перемещаемыми объектами…
Но если я использую его несколько раз подряд, он начинает создавать странный визуальный артефакт, показанный на изображении.
Само поле перерисовано над областью, замаскировано ромбовидной формой, возможно, полученной из переключателя рядом с ним. У меня нет этой проблемы, когда я заменяю метку, что, вероятно, лучший способ, так как на самом деле я не хочу, чтобы пользователь напрямую добавлял текст в поле; значения ограничены, и это было бы больше похоже на ПИТУ.
С другой стороны, сопоставление основных вставок на этикетке с тем, что вы видите в текстовом поле, тоже кажется полным ПИТОМ, и сейчас проект работает с UITextFields, поэтому я бы предпочел выяснить, как избежать этого, все еще используя их.
Есть идеи, почему это могло произойти? Объекты создаются в раскадровке, но распознаватель жестов добавляется программно.
Это и есть код
func addPanGesture(view: UITextField) { let pan = UIPanGestureRecognizer(target: self, action: #selector(FileSelectorController.handlePan(sender:))) view.addGestureRecognizer(pan) } @objc func handlePan(sender: UIPanGestureRecognizer) { let field = sender.view as! UITextField if field.text == "" { return } var upperLimit : Float? var lowerLimit: Float = 0.0 if field == strokeWeightValue { upperLimit = 40.0 } let defaultVal : Float = 1.0 let startingVal = Float(field.text!) ?? defaultVal let translation = sender.translation(in: view) var newVal : Float = startingVal switch sender.state { case .began, .changed: newVal = startingVal Float(translation.x)/50 var limitedVal = max(lowerLimit,newVal) if upperLimit != nil { limitedVal = min(upperLimit!, limitedVal)} field.text = formatDecimal(value: limitedVal) default : break } }
Комментарии:
1. Это увеличительное стекло для текстового поля, оно появляется практически в любом текстовом поле, когда вы нажимаете и удерживаете