2014-12-07 56 views
0

我想在用户第一次进入应用程序时(指示点击什么)在UISlider的动画(闪烁)拇指。可以对UISlider的UIImage Thumb进行动画制作吗?

我设置的UIImage作为一个拇指:

[self.textNavigationSlider setThumbImage:thumbImage forState:UIControlStateNormal]; 

我可以采用某种动画它(也许只是改变这个UIImage的动画的阿尔法)?

This slider

PS(此播放按钮是UIImage的)

回答

1

我不相信你可以为图像的alpha值设置动画,并且我们无法访问拇指的图像视图(如果有的话)来动画它的alpha。你可以做的一件事是添加一个图像视图作为滑块的子视图,并使其略大于拇指图像,并为其alpha值设置动画(它将位于拇指图像后面,因此它将显示为一个脉动环)。在这个例子中,我设置图像视图在thumbRectForBounds框架:trackRect:值:和取消的touchesBegan动画,

@interface RDSlider() 
@property (strong, nonatomic) UIImageView *iv; 
@end 

@implementation RDSlider // subclass of UISlider 

-(void)awakeFromNib { 
    self.minimumTrackTintColor = [UIColor colorWithRed:75/255.0 green:180/255.0 blue:150/255.0 alpha:1]; 
    self.maximumTrackTintColor = [UIColor colorWithRed:50/255.0 green:120/255.0 blue:100/255.0 alpha:1]; 
    [self setThumbImage:[self createThumbImage] forState:UIControlStateNormal]; 
    self.iv = [UIImageView new]; 
    self.iv.backgroundColor = [UIColor greenColor]; 
    [self addSubview:self.iv]; 
} 


-(void)didMoveToWindow { 
    [UIView animateWithDuration:.6 delay:0 options:UIViewAnimationOptionAutoreverse|UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationOptionRepeat|UIViewAnimationOptionCurveEaseInOut animations:^{ 
     self.iv.alpha = 0; 
    } completion:^(BOOL finished) { 
     [self.iv removeFromSuperview]; 
     self.iv = nil; 
    }]; 
} 



-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self.iv.layer removeAllAnimations]; // calling this causes the animation's completion block to be executed 
    [super touchesBegan:touches withEvent:event]; 
} 



- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value { 
    CGRect thumbRect = [super thumbRectForBounds:bounds trackRect:rect value:value]; 
    self.iv.frame = CGRectInset(thumbRect,-2,-2); 
    self.iv.layer.cornerRadius = self.iv.frame.size.width/2.0; 
    self.iv.layer.masksToBounds = YES; 
    return thumbRect; 
} 


-(UIImage *) createThumbImage { 
    UIBezierPath *border = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 28, 28)]; 
    UIBezierPath *center = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(.5, .5, 27, 27)]; 
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(border.bounds.size.width, border.bounds.size.height), NO, 0.0); 
    [self.minimumTrackTintColor setFill]; 
    [border fill]; 
    [[UIColor whiteColor] setFill]; 
    [center fill]; 
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return img; 
} 
+0

当我试图从StoryBoard设置这个子视图时,didMoveToWindow似乎在显示视图之前被执行,并且我立即调用完成块。 (我刚刚创建了公共方法 - startBlinking) – 2014-12-08 00:29:13

+0

@PaulBrewczynski,我不知道那是为什么。我的测试应用程序在故事板中有滑块,并且工作正常。你有没有和我一样的动画方法有相同的选项?你现在有工作吗(用你的公开方法)? – rdelmar 2014-12-08 00:52:07

1

如果你想为一个时间按照以下步骤。

  1. 创建新的UIImageView让我们说fakeImageView。

  2. 使用UIViewAnimation

  3. 动画它一旦动画完成,隐藏...(fakeImageView.hidden = YES)

对于UIViewAnimation教程,请访问herehere

+0

这是很不错的方式。不是非常可定制的,但很好的黑客。谢谢。 – 2014-12-07 19:33:56

+0

@PaulBrewczynski:我发现很少有人将任何问题的答案标记为接受的答案......如果您将答案标记为已接受,如果该答案解决了您的问题,那将是非常好的...... **这就是SO的工作原理...... ** – 2014-12-08 06:35:12

1

你可以使滑块的精确副本,除了没有拇指图像,并把它在第一个下面。然后制作整个第一个滑块的alpha值,理论上应该给人以仅用拇指动画的印象;-)当动画完成时,您可以删除第二个滑块。

0

您可以访问UISlider object.subviews。通常(不保证)第三个元素(应该是.lastObject)是拇指图像的UIImageView。