自动滚动 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 触发滚动
当我想更改 `UISlider` 中的值时,scrollView 会向左滚动而不是滑块