自动滚动 UISlider

Posted

技术标签:

【中文标题】自动滚动 UISlider【英文标题】:Scroll UISlider Automatically 【发布时间】:2013-07-09 22:02:49 【问题描述】:

所以目前我在 UIViewcontroller 中有一个 UISlider,用于在用户滑动时在子视图中启动动画。基本上,当用户滑动时,我有这个电池,里面有一个填充物,用一个条形填充空电池图像指示电池内的电量,用户可以滑动查看电池在一天中特定时间的电量。

目前,当视图加载时,我希望 UISlider 自动从滑块的开头开始滑动并在 5 秒内滚动到结尾。

我实现了一个循环,使用这个循环遍历uislider的所有值

for (int i = 0; i < [anObject count] - 2; i++)

    sleep(.25);
    NSUInteger index = (NSUInteger)(slider.value + 0.5); // Round the number.
    [slider setValue:index animated:YES];

[anObject count] - 2 在一天中的这个时候等于 62,但会每 15 秒更改一次并递增,因为我正在从服务器获取数据。

但除此之外,为什么这不起作用?循环?

编辑:

这就是我对 NSTIMER 所做的事情

[NSTimer timerWithTimeInterval:0.25 target:self selector:@selector(animateSlider) userInfo:nil repeats:NO];

animateSlider 看起来像这样:

- (void)animateSlider:(NSTimer *)timer

    NSLog(@"Animating");
    NSUInteger index = (NSUInteger)(slider.value + 0.5); // Round the number.
    [slider setValue:index animated:YES];

但没有运气......为什么 NSTimer 没有“触发”......我模糊地记得有一种方法可以触发一个 nstimer 方法,但不确定是否需要......

编辑:

啊,它确实需要“火”....

NSTimer *timer = [NSTimer timerWithTimeInterval:0.25 target:self selector:@selector(animateSlider) userInfo:nil repeats:NO];
[timer fire];

但由于某种原因,它只触发一次......有什么想法吗?

【问题讨论】:

在这种情况下不要使用sleep();。这将暂停整个应用程序。 而是:setValue:animated:,或类似的。 最好使用每 0.25 秒触发一次并更新滚动视图的 NSTimer。然后,当它达到某个值时,您可以使计时器无效。这样你就不必睡觉,也没有 for 循环。 【参考方案1】:

“由于某种原因,它只触发一次......”

如果您将 NSTimer 设置更改为:

NSTimer *timer = 
   [NSTimer scheduledTimerWithTimeInterval:0.25 
                                    target:self 
                                  selector:@selector(animateSlider:) 
                                  userInfo:nil 
                                   repeats:YES];

这将立即在当前运行循环中安排计时器。

并且由于“repeats”参数为“YES”,然后您将每四分之一秒重复一次计时器,直到您使计时器无效(当达到结束条件时您应该这样做,例如当滑块到达其目的地时)。

附:您需要稍微更改计时器目标的选择器方法声明。 According to Apple's documentation, "选择器必须对应于返回 void 并接受单个参数的方法。计时器将自身作为参数传递给此方法。"

所以像这样声明“animateSlider”:

- (void)animateSlider: (NSTimer *) theTimer;

【讨论】:

什么都没有发生....我不小心有点过分热心并对此表示赞同,但它不是多次“触发”,只是一次....让我检查一下代码...但是我的 animateSlider 方法有一个日志语句,我只注意到一个日志语句......不是很多......我假设我会得到很多日志语句,但我只得到一个:/ 您可能需要稍微调整您的“animateSlider”方法。请参阅我编辑的答案。 所以我调整了方法但仍然没有,只得到一个日志语句“动画”:/。你还有什么可以建议的吗?我应该在方法中的任何地方传递变量“theTimer”吗?我想我应该在哪里,但不确定在哪里...... 你还在明确地调用“fire”吗?如果是这样,你不需要。不,“theTimer”不需要明确传递或引用。它只是调用您的“animateSlider”方法的计时器实例。我开始怀疑您的视图控制器是否没有持久化,或者计时器是否正在被释放或以某种方式在创建时失效? 当你的意思是明确的......你的意思是在方法调用之外吗?因为我在上面的代码中所做的正是我实现方法和viewcontroller的方式......另外,NSTimer变量放在viewDidLoad中。不太确定现在要走了,但我差点说f *** it....这太琐碎了:/

以上是关于自动滚动 UISlider的主要内容,如果未能解决你的问题,请参考以下文章

防止 UIScrollView 中的 UISlider 触发滚动

阻止UIScrollView中的UISlider触发滚动

当我想更改 `UISlider` 中的值时,scrollView 会向左滚动而不是滑块

如何将大图像添加到 UISlider 背景或放置在滚动视图中?

ViewPager自动滚动

自动滚动:如何在滚动视图中自动滚动图像