iphone sdk 中的 UISlider 拇指动画

UISlider Thumb Animation in iphone sdk

提问人:Sudhakar 提问时间:12/1/2015 更新时间:12/8/2015 访问量:826

问:

如何在iphone sdk中为uislider拇指动画制作动画? 请在下面检查我的代码。

创建滑块

slider = [[UISlider alloc] initWithFrame:CGRectMake(0.0, 300.0, 320.0, 3.0)];
[[UISlider appearance] setThumbImage:[UIImage imageNamed:@"chnavigate-1.png"] forState:UIControlStateNormal];
UIImage *clearImage = [[UIImage imageNamed:@"png1.png"] stretchableImageWithLeftCapWidth:14.0 topCapHeight:0.0];
    [slider setMinimumTrackImage:clearImage forState:UIControlStateNormal];
    [slider setMaximumTrackImage:clearImage forState:UIControlStateNormal];


[slider addTarget:self
           action:@selector(sliderAction:)
 forControlEvents:UIControlEventValueChanged];

slider.minimumValue=0.0;
slider.maximumValue=3.6;
[slider setValue:0.0];
//slider.value = 0.1f;
[slider setContinuous:YES];
//slider.thumbTintColor=[UIColor redColor];
[slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];

动画代码如下:

[UIView animateWithDuration:0.3 delay:1.3 usingSpringWithDamping:0.1 initialSpringVelocity:1.0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
    //Animations
    slider.frame = CGRectMake(slider.frame.origin.x,slider.frame.origin.y - 20,slider.frame.size.width,slider.frame.size.height);
}
                 completion:^(BOOL finished) {
                     //Completion Block
                 }];

此动画为动画提供了完整的 silder。我的要求是仅对 onlu 滑块拇指图像进行动画处理。 给我发麻。 谢谢。。。

iOS的iPhone iOS7 iOS6 UI滑块

评论

0赞 paulmrest 12/1/2015
您尝试将什么动画应用于滑块的拇指图像?如果尝试简单地在滑块上移动拇指图像,请使用 UISlider 的 setValue:animated: 方法。如果没有,我需要详细说明您到底要让拇指图像做什么。
0赞 Sudhakar 12/1/2015
移动 20 像素上下移动动画。
0赞 paulmrest 12/7/2015
假设您尚未解决此问题,您是尝试在拇指图像静止不动时、用户主动沿滑块移动拇指图像时对拇指图像进行动画处理,还是两者兼而有之?

答:

0赞 paulmrest 12/8/2015 #1

我做了一些研究并编写了一些测试代码,我的结论是,除了以下一种情况外,您无法对 UISlider 的拇指图像进行动画处理:当拇指位于滑块的正中间并且不移动时。

在这种情况下,您可以使用您选择的拇指图像制作 UIImageView(因为您无法对 UIImage 进行动画处理)(您必须制作一个,从 iOS 7+ 开始无法获取指向默认拇指图像的指针),将其作为子视图放置在 UISlider 上的默认拇指图像上,并对其进行动画处理。

但是,一旦拇指处于非居中位置,您就会遇到这样一个事实,即无法获取 UISlider 的轨道大小,并且轨道大小小于 UISlider 的 frame.size.width 的某个数量/因子/幻数,这些数字隐藏在 Apple 的实现中。

我想到的两种方法如下:

  1. 响应 UISlider UIControlEventValueChanged 通知,并重新计算覆盖 UISlider 拇指图像的 UIImageView 的位置。但是,如果基于 UISlider 的 frame.size.width 进行此计算,则一旦离开中心位置,默认拇指和 UIImageView 之间就会开始出现偏移。偏离中心越远,此偏移量就越大,当您移回中心时,该偏移量将返回 0(完美对齐)。
  2. 让 UIImageView 独立响应触摸事件。但是,和以前一样,由于无法获取 UISlider 的轨道大小,虽然您可以将 UIImageView 锁定为初始 y 值并让它沿 x 移动,但无法知道最大或最小 x 值是多少。

无论哪种情况,您都可以跟踪并错误地得出 UISlider 的帧宽度与轨道宽度之间的差值,该值可能适用于给定版本的 iOS 中的给定情况,但不能保证其他情况或更新不会破坏它。

如果这是必不可少的,我的解决方案是创建我自己的 UISlider 版本作为 UIControl 的子类,允许这样的事情。

评论

0赞 Sudhakar 12/8/2015
谢谢,现在我确实喜欢你说的,但我正在寻找,有什么办法可以解决这个问题。