Пульсирующий подкласс UIButton - PullRequest
0 голосов
/ 15 июля 2011

Я делаю простой подкласс UIButton, который «пульсирует», изменяя альфу с помощью анимации UIView.Проблема, с которой я сталкиваюсь, это установка альфа на 1 (100%), когда пользователь нажимает кнопку.У меня есть код для приостановки и возобновления анимации, но установка непрозрачности до или после вызова pauseAnimations, похоже, не работает.

Приостановка / возобновление анимации на слое UIView:

-(void)pauseAnimation {
    CFTimeInterval pausedTime = [self convertTime:CACurrentMediaTime()
                                        fromLayer:nil];
    self.speed = 0.0;
    self.timeOffset = pausedTime;
}

-(void)resumeAnimation {
    CFTimeInterval pausedTime = [self timeOffset];
    self.speed = 1.0;
    self.timeOffset = 0.0;
    self.beginTime = 0.0;
    CFTimeInterval timeSincePause = [self convertTime:CACurrentMediaTime() 
                                            fromLayer:nil] - pausedTime;
    self.beginTime = timeSincePause;
}

Код для подкласса UIButton:

-(id)initWithAnimationInterval:(NSTimeInterval)interval andMinimumAlpha:
(float)minimumAlpha andMaximumAlpha:(float)maximumAlpha {
    if ((self = [super init])) {
        _animationInterval = interval;
        _minimumAlpha = minimumAlpha;
        _maximumAlpha = maximumAlpha;

        self.alpha = self.minimumAlpha;

        [self addTarget:self action:@selector(buttonDown) 
                forControlEvents:UIControlEventTouchDown];
        [self addTarget:self action:@selector(buttonUp) 
                forControlEvents:UIControlEventTouchUpInside];
        [self addTarget:self action:@selector(buttonUp) 
                forControlEvents:UIControlEventTouchUpOutside];

        [self startAnimating];
    }

    return self;
}

-(void)startAnimating {
    [UIView animateWithDuration:self.animationInterval
                          delay:0
                        options:UIViewAnimationOptionAllowAnimatedContent | 
UIViewAnimationOptionAllowUserInteraction | 
UIViewAnimationOptionAutoreverse | 
UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionRepeat
                     animations:^{
                         self.alpha = self.maximumAlpha;
                     }
                     completion:^(BOOL finished) {

                     }];
}

-(void)buttonDown {
    [self.layer pauseAnimation];

    self.oldAlpha = self.alpha;
    self.alpha = self.maximumAlpha;
}

-(void)buttonUp {
    self.alpha = self.oldAlpha;
    [self.layer resumeAnimation];
}

Ответы [ 2 ]

0 голосов
/ 15 июля 2011

Если вы не используете пользовательский слой Core Animation, возможно, вы хотите, чтобы ваши методы паузы и возобновления выглядели так (от http://developer.apple.com/library/ios/#qa/qa1673/_index.html):

-(void)pauseLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    layer.speed = 0.0;
    layer.timeOffset = pausedTime;
}

-(void)resumeLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer timeOffset];
    layer.speed = 1.0;
    layer.timeOffset = 0.0;
    layer.beginTime = 0.0;
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    layer.beginTime = timeSincePause;
}

И передать button.layer как CALayer. Если вы не хотите передавать слой, измените ссылки, такие как self.speed и self.timeOffset на self.layer.speed и self.layer.timeOffset, поскольку эти свойства доступны только для слоя, но не для самой кнопки.

0 голосов
/ 15 июля 2011

Попробуйте удалить UIViewAnimationOptionRepeat из параметров анимации.Если вы используете его там, это означает, что анимация будет повторяться бесконечно.Так что это не поможет остановить таймер, потому что анимация будет повторяться.

Вы думали об использовании NSTimer?Кажется, к более легкому подходу.Вот что я сделал:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [button addTarget:self action:@selector(buttonDown) forControlEvents:UIControlEventTouchDown];
    [button addTarget:self action:@selector(buttonUp) forControlEvents:UIControlEventTouchUpInside];
    [button addTarget:self action:@selector(buttonUp) forControlEvents:UIControlEventTouchUpOutside];

    [self startTimer];

}

- (void)startTimer {
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.4 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
}

- (void)stopTimer {
    [timer invalidate];
}

- (void)buttonDown {
    [self stopTimer];
    button.alpha = 1;
}

- (void)buttonUp {
    [self startTimer];
}

- (void)timerFired:(NSTimer *)timer {
    [UIView animateWithDuration:0.4
                          delay:0
                        options:UIViewAnimationOptionAllowAnimatedContent | 
     UIViewAnimationOptionAllowUserInteraction | 
     UIViewAnimationOptionAutoreverse | 
     UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         button.alpha = MIN_ALPHA;
                     }
                     completion:^(BOOL finished) {
                         button.alpha = 1;
                     }];
}

Я не использовал подкласс для кнопки, но вы могли легко переместить его туда.

Надеюсь, это поможет.

...