【问题标题】:Autoscrolling feature for UILabelUILabel 的自动滚动功能
【发布时间】:2013-11-04 08:39:16
【问题描述】:

我有谷歌搜索它,但没有在互联网上找到任何东西来解决我的问题,但我认为我的问题将非常容易解决,但我找不到合适的关键字。

我有一个视图控制器,其中包含一个名为 ReadingView 的文本,该视图具有很长的文本,可以滚动阅读文本。当用户进入 ReadingView 时,它会自动向下滚动到底部,用户可以通过我实现的 UISlider 来提高滚动速度

问题是我可以通过这段代码毫无问题地进行自动滚动

 [UIScrollView beginAnimations:@"scrollAnimation" context:nil];
 [UIScrollView setAnimationDuration:1.0f];
 [scroll setContentOffset:CGPointMake(x, y)];
 [UIScrollView commitAnimations];

但上面的代码是基于时间的。我必须找到基于帧或像素的动画。因为,如果我使用基于时间的动画,一些文本很长,它会非常非常快地向下滚动到底部,而短文本会非常慢。

你们知道我是否可以做类似的动画

“嘿,滚动视图,你必须每帧向下移动 10 个像素,直到 上下文结束,我不在乎需要多长时间,固定速度!!”

谢谢你的帮助,你们可以给我一个关键字或任何东西来帮助我

更新 由 Fogmeister 推荐完成。 这个概念是使用块动画并通过使用计算每个文本的时间 时间=文本长度/速度 并且您将获得每个文本的不同时间并使用该时间来制作动画。我从来没有想过这个......我一直在寻找的是通过PIXEL做动画的功能,这是一个错误的关键字。

CGFloat scrollingPointSpeed = myslider.value; //value of UI Slider//
CGFloat time = offset/scrollingPointSpeed ;
[UIView animateWithDuration:time delay:0.0 options:UIViewAnimationOptionCurveLinear animation:^()
{
 self.scroll.contentOffset = CGPointMake(0, offset);
}
completion:nil];

【问题讨论】:

  • 根据uilabel中的总行数设置setAnimationDuration
  • 这种动画方法不应该在 iOS 4 或更高版本中使用。你应该像我的回答那样使用基于块的动画。

标签: ios animation uiscrollview


【解决方案1】:

好的,首先,您不应该使用CABasicAnimation。最佳实践方法是使用基于块的动画。

其次,这应该相当容易。

你可以计算一个滚动视图的最大偏移量...

CGFloat maxOffsetWidth = self.scrollView.contentSize.width - CGRectGetWidth(self.scrollView.frame);

这是可以应用的最大滚动量。即距离。

现在,要计算出持续时间(时间),您需要牢记速度。假设每秒 50 点。

所以现在让我们把它放在一起......

CGFloat maxOffsetWidth = self.scrollView.contentSize.width - CGRectGetWidth(self.scrollView.frame);

CGFloat scrollingPointsPerSecond = 50.0;

CGFloat time = maxOffsetWidth / scrollPointsPerSecond;

[UIView animateWithDuration:time
                 animations:^() {
    self.scrollView.contentOffset = CGPointMake(maxOffsetWidth, 0);
}];

显然,这是用于水平滚动,如果您想要垂直,则只需使用不同的值。

快速编辑

上述动画函数使用默认的动画曲线UIAnimationOptionCurveEaseInOut。这意味着滚动的速度会从一开始的0慢慢加速,然后慢慢减速回到0。

您可能想要的是线性运动。即滚动的速度一直是相同的。为此,您需要一个与上述功能略有不同的功能。它只是添加了几个额外的参数...

[UIView animateWithDuration:time
                      delay:0.0
                    options:UIViewAnimationOptionCurveLinear
                  animation:^() {
                      self.scrollView.contentOffset = CGPointMake(maxOffsetWidth, 0);
                  }
                 completion:nil];

这将通过线性运动完全满足您的要求。

【讨论】:

  • 太棒了!!!谢谢你。我用你的方法来计算文本的总高度并除以 UISlider 的速度。我知道它应该像这样超级简单,但是太愚蠢了!!哈哈谢谢。
  • 不用担心。我总是发现自己想太多,把非常简单的问题变得非常复杂。很高兴我能帮忙:)
  • @Fogmeister 我将您的解决方案用于文本视图,它会自动滚动到最后,但最初,它会在 textview 中隐藏部分文本,完成动画后,它会再次正确显示所有文本。我正在使用以下代码: UIView.animate(withDuration: time, delay: 5.0, options: .curveLinear, animations: { self.textView.contentOffset = CGPoint(x: 0.0, y: maxOffsetHeight) }, completion: nil) 我想它必须正确设置 contentOffset。我正在使用 swift 4.2 和 iOS 12 模拟器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
相关资源
最近更新 更多