Wonky Animation - PullRequest
       9

Wonky Animation

0 голосов
/ 10 апреля 2019

Пользователь вводит поисковый запрос и генерирует таблицу совпадений. Пользователь может выбрать строку для просмотра подробного текста, отображаемого в UITextView. В подробном текстовом представлении можно нажимать кнопку инкремента, чтобы циклически проходить через сопоставленный текст. Кнопка продвигает индекс, который увеличивает индексы массива значений NSRange, которые представляют местоположение совпадающего текста в UITextView. При нажатии на кнопку инкремента contentOffset используется для прокрутки пользователя до соответствующего текста в UITextView. В то же время существует прямоугольник с закругленными углами, который перемещается вместе с анимацией contentOffset. Округленное прямоугольное представление обводит сопоставленный текст в виде визуальной подсказки, указывающей, какой сопоставленный текст идентифицирован.

Функция анимации вставлена ​​ниже. Анимация работает почти идеально. Однако, если между каждым сопоставленным текстовым диапазоном имеется большой объем текста, функция contentOffset не прокручивает до совпадения, и представление с закругленными прямоугольниками перемещается в неверное место в UITextView. Если я несколько раз нажму на кнопку инкремента, анимация исправит себя, и и contentOffset, и анимированный прямоугольник с закругленными углами идеально подойдут к сопоставленному тексту. Я также могу исправить проблему, если я нажму на ссылку и вернусь к подробному виду.

Есть мысли о том, как исправить эту проблему?

// called when button pressed.  
func matchProcessing(matchRange:NSRange, InTextView textView:UITextView){

   // unhide the rounded rectangle view that will circle matched text
   self.detailText.viewWithTag(1)?.isHidden = false

   //get rect of NSRange of matched text 
   let matchTxtRect = textView.layoutManager.boundingRect(forGlyphRange: matchRange, in: textView.textContainer)

    self.view.layoutIfNeeded()

   //animation of scroll and rounded rectangle view

    UIView.animate(withDuration: 0.8, delay: 0.0, options: .curveEaseInOut, animations:

        {

            textView.contentOffset = CGPoint(x: 0.0, y: matchTxt.origin.y)

          // get rect of                      
            let nextDestination = self.frameOfTextInRange(range: self.arrayOfMatches[self.matchIndex], inTextView: textView)

            //this does not work either: let nextDestination = textView.layoutManager.boundingRect(forGlyphRange: self.arrayOfMatches[self.matchIndex], in: textView.textContainer)

            let destination = textView.viewWithTag(1)?.convert(textView.viewWithTag(1)!.center, from: textView.viewWithTag(1)?.superview)

             textView.viewWithTag(1)?.move(to: (destination?.applying(
                    CGAffineTransform(translationX: nextDestination.origin.x, y: nextDestination.origin.y)))!,
                                  duration: 0.8,
                                  options: .curveEaseInOut)

              UIView.animate(withDuration: 0.6, delay:0, options: [.repeat, .autoreverse, .curveEaseInOut], animations: {
                self.detailText.viewWithTag(1)?.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)

                    self.view.layoutIfNeeded()
            })

            }, completion: nil )

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...