2013-12-14 2 views
1

Я пытаюсь добиться простого поведения:CABasicAnimation ручной прогресс от UISlider

Изменение opacity из CALayer используя значение UISlider.

Я хочу сделать это с помощью CABasicAnimation, то, что я написал с тех пор, хорошо работает, но когда ползунок имеет значение 1.0, непрозрачность возвращается к 0.0, тогда как она должна быть в 1.0 (окончательное запрошенное значение).

Вот код:

// Function called when slider changes values 
- (IBAction)sliderDidChangeValue:(id)sender { 

    CABasicAnimation *anim = [self fader:1.0 from:0.0]; 
    anim.timeOffset = ((UISlider*)sender).value; 

    // The animatedView gets the new animation with updated timeOffset 
    [self.animatedView.layer addAnimation:anim forKey:@"opacity"]; 
} 

// This a simple helper function to create the fade animation 
- (CABasicAnimation*)fader:(float)to from:(float)from{ 

    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    anim.fromValue = [NSNumber numberWithFloat:from]; 
    anim.toValue = [NSNumber numberWithFloat:to]; 
    anim.fillMode = kCAFillModeForwards; 
    anim.speed = 0.0; 
    anim.duration = 1.0; 
    anim.removedOnCompletion = NO; 

    return anim; 
} 

ответ

-3

код вы вывесили полностью игнорирует значение ползунка и передает константу или ваш от (0) и до значения (1). Я не вижу, как он делает что-то близкое к тому, что вы хотите.

+2

Значение ползунка используется для смещения по времени. – jrturton

3

Точно так же timeOffset работ. Продолжительность остается неизменной, просто все значения смещаются вокруг.

Эффект, о котором вы говорите, может (если я правильно помню) быть достигнут с отрицательным beginTime.

2

Вы не указываете, почему требуется явная анимация с использованием CABasicAnimation. Здесь нет необходимости предполагать, что вы просто хотите оживить непрозрачность слоя. Вы можете просто использовать неявную анимацию, установив непрозрачность непосредственно на слое animatedView «s:

- (IBAction)sliderDidChangeValue:(id)sender 
{ 
    CGFloat value = ((UISlider*)sender).value; 
    self.animatedView.layer.opacity = value; 
} 

Сказав, что, хотя, вы должны знать, что это не будет фактически выполнять анимацию, потому что вы используете корневой слой вид. Вместо этого добавьте еще один слой в иерархию представлений и вместо этого запустите его непрозрачность.

Сначала добавьте подуровень вы собираетесь анимировать

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _animatedLayer = [CALayer layer]; 
    _animatedLayer.position = CGPointMake(200.0f, 200.0f); 
    _animatedLayer.bounds = CGRectMake(0.0f, 0.0f, 200.0f, 300.0f); 
    _animatedLayer.backgroundColor = [[UIColor orangeColor] CGColor]; 

    [self.view.layer addSublayer:_animatedLayer]; 

} 

Затем, когда изменения ползунков, неявно анимировать изменение путем установки значения непосредственно и завернуть изменения в CATransaction, так что вы можете управлять анимацией продолжительность.

- (IBAction)sliderDidChange:(id)sender 
{ 
    [CATransaction begin]; 
    [CATransaction setAnimationDuration:1.0f]; 
    self.animatedLayer.opacity = [(UISlider*)sender value]; 
    [CATransaction commit]; 

} 

Помните, что при установке свойства в анимации, не фактически установки значения в слое, а просто показывает его в анимации. Вы должны фактически установить значение в слое, если хотите, чтобы он остался. Вот почему желательно использовать неявную анимацию и просто устанавливать свойство напрямую.

Я отправил быстрый проект на Github: https://github.com/perlmunger/FadeViewOpacity.git

Позвольте мне знать, если это не то, что вы искали. Я не совсем уверен, что понимаю проблему, которую вы пытаетесь решить.

+0

Отличный ответ! Проблема, с которой я сталкиваюсь, сложнее, чем то, что я написал в этом вопросе ... Это самый простой сценарий, с которым я могу столкнуться с каркасом, который я пытаюсь построить. Моя основная проблема заключается в том, что я не могу понять, почему анимация возвращается к исходному значению, когда ползунок имеет значение 1.0. – MatterGoal

Смежные вопросы