UIView.animateWithDuration 在 UITextfield 的 contentoffset 上:它剪辑文本 (Swift)

UIView.animateWithDuration on UITextfield's contentoffset: It clips the text (Swift)

我使用以下代码:

    UIView.animateWithDuration(30, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: {
        self.textView.contentOffset = CGPointMake(0, 700)
        }, completion: nil)

如果 contentOffset 大约为 100,则动画可以正常工作并且所有文本都可见。高于此值的所有内容都会导致动画期间文本标签开头的文本消失。 contentOffset 越高,动画期间消失的文本就越多。所以我看到白色 space 一段时间,然后剩余的文本进入动画。另外:动画完成后,当我向上滚动时所有文本再次可见。

我在各种超级视图中尝试过多个 UITextview。总体思路是一种类似于动画的致谢名单,其中所有文本缓慢向上移动约 30 秒。

您可以尝试像下面这样将小动画循环在一起。

func animate(count:Int)
{
    if (count > 100)
    {
        return
    }
    UIView.animateWithDuration(1, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: {

        self.textView.contentOffset = CGPointMake(0, self.textView.contentOffset.y + 10)
        }, completion: { finished in
            dispatch_async(dispatch_get_main_queue(),{
                self.animate(count+1)
        })
    })

}

即使在 iOS 10 SDK 中,这似乎仍然是一个问题。

为了解决这个问题,我使用 setContentOffset: 手动设置滚动动画,使用 performSelector: withObject: afterDelay: 延迟每个步骤并实现一种一次滚动一个增量的方法(在我的例子中是 1/2 点).

要防止用户手动覆盖滚动动画,您必须手动禁用用户交互(animateWithDuration: 在播放动画时自动禁用用户滚动),您还必须启用滚动。我还禁用了选择和编辑,因为这适合我的用途:

注意:Objective-C代码如下

textBox.editable = NO;
textBox.selectable = NO;
textBox.scrollEnabled = YES;
textBox.userInteractionEnabled = NO;

float contentLength = textBox.contentSize.height - textBox.frame.size.height;
float timePerLine = audioLength / contentLength;

for (float i = 0; i < contentLength; i+=0.5){
    [self performSelector:@selector(scrollOneLine) withObject:nil afterDelay:timePerLine * i];
}

然后实现了一个方法,用作一次滚动一个增量的选择器

-(void) scrollOneLine {
    float currentPosition = textBox.contentOffset.y;
    [textBox setContentOffset:CGPointMake(0, currentPosition + 0.5) animated:NO];
}