奇异的动画

时间:2019-04-10 02:11:44

标签: swift uitextview

用户输入搜索词并生成匹配表。用户可以选择一行以查看UITextView中显示的详细文本。在详细文本视图中,可以点击一个增量按钮来循环显示匹配的文本。该按钮前进一个索引,该索引增加NSRange值数组的索引,这些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 )

}

0 个答案:

没有答案