2014-12-07 28 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。