UIView.animateWithDuration对UITextfield的contentoffset的影响:它会剪裁文本(Swift)

3
我使用以下代码:
    UIView.animateWithDuration(30, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: {
        self.textView.contentOffset = CGPointMake(0, 700)
        }, completion: nil)

如果contentOffset高达100左右,动画效果就正常了,所有文本都是可见的。而超过这个值的话,在textlabel的开始位置文本会消失,contentOffset值越高,动画期间消失的文本也就越多。所以我会看到一段时间的白色空间,然后剩余的文本才开始出现在动画中。另外:一旦动画结束,向上滚动时所有的文本就又都是可见的了。

我已经尝试了多个不同父视图下的UITextviews,总体想法是类似Credits(片头字幕)的动画,所有文本缓慢向上移动约30秒。


iOS 13仍然存在这个问题。 - Aliaksandr Andrashuk
iOS 15仍然存在... - David
2个回答

4
你可以尝试将小的动画循环在一起,例如下面的代码。
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)
        })
    })

}

1
虽然我仍然不理解原始方法的问题在哪里,但这是一个很好的想法,而且运行得相当不错。谢谢。 - hoshy

0

即使在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];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接