быстрый жест панорамирования отображает странное визуальное поведение

#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. Это увеличительное стекло для текстового поля, оно появляется практически в любом текстовом поле, когда вы нажимаете и удерживаете