0

ボタンをクリックすると光り、もう一度クリックすると光りたいUIButtonに画像があります。

クリックするたびに光りません。明るくなるだけです。UIView animateWithDuration だけでなく、CATransition と CABasicAnimation も試しました。

何かが間違っている。おそらく私が知っておくべき基本的なことです。

助けていただければ幸いです。

私のコードは次のとおりです。

-(void)didTapButton:(UIButton *)button {

button.selected = !button.selected;

UIColor *glowColor = [self.arrayOfGlowColor objectAtIndex:button.tag];
UIImageView *imageView = button.imageView;
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, [UIScreen mainScreen].scale);
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0,0,imageView.bounds.size.width,imageView.bounds.size.height)];
[glowColor setFill];
[path fillWithBlendMode:kCGBlendModeSourceAtop alpha:1.0];

UIImage *imageContext_image = UIGraphicsGetImageFromCurrentImageContext();

UIView *glowView = [[UIImageView alloc] initWithImage:imageContext_image];
glowView.center = imageView.center;
[imageView.superview insertSubview:glowView aboveSubview:imageView];

glowView.alpha = 0;
glowView.layer.shadowColor = glowColor.CGColor;
glowView.layer.shadowOffset = CGSizeZero;
glowView.layer.shadowRadius = 10;
glowView.layer.shadowOpacity = 1.0;

/*
[UIView animateWithDuration: 1.0 animations:^(void) {
    glowView.alpha = (button.selected) ? 1.0 : 0.0f;
}];
NSLog(@"glowView.alpha:%f",glowView.alpha);
NSLog(button.selected ? @"YES" : @"NO");
*/
/*


if (button.selected) {
    CATransition *fadeIn = [CATransition animation];
    fadeIn.duration = 1.0;
    fadeIn.startProgress = 0.0f;
    fadeIn.endProgress = 1.0f;
    [fadeIn setType:kCATransitionFade];
    fadeIn.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    [fadeIn setFillMode:@"extended"];
    [glowView.layer addAnimation:fadeIn forKey:nil];

}

if (!button.selected) {
    CATransition *fadeOut = [CATransition animation];
    fadeOut.duration = 1.0;
    fadeOut.startProgress = 1.0f;
    fadeOut.endProgress = 0.0f;

    [fadeOut setType:kCATransitionFade];
    fadeOut.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    [fadeOut setFillMode:@"extended"];
    [glowView.layer addAnimation:fadeOut forKey:nil];

}
*/


if (button.selected) {

//Create a one-way animation that fades in the glow.
    glowView.layer.opacity = 1.0;
CABasicAnimation *glowFadeInAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
glowFadeInAnim.fromValue = [NSNumber numberWithDouble:0.0];
glowFadeInAnim.toValue = [NSNumber numberWithDouble:1.0];

glowFadeInAnim.repeatCount = 1;
glowFadeInAnim.duration = 1.0;
glowFadeInAnim.autoreverses = FALSE;
    glowFadeInAnim.fillMode = kCAFillModeForwards;
    glowFadeInAnim.removedOnCompletion = NO;
glowFadeInAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];


[glowView.layer addAnimation:glowFadeInAnim forKey:nil];
}


if (!button.selected) {
            glowView.layer.opacity = 1.0;
    CABasicAnimation *glowFadeOutAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
    glowFadeOutAnim.fromValue = [NSNumber numberWithDouble:1.0];
    glowFadeOutAnim.toValue = [NSNumber numberWithDouble:0.0];

    glowFadeOutAnim.repeatCount = 1;
    glowFadeOutAnim.beginTime = 2;
    glowFadeOutAnim.duration = 2.0;
    glowFadeOutAnim.autoreverses = FALSE;
    glowFadeOutAnim.fillMode = kCAFillModeForwards;
    glowFadeOutAnim.removedOnCompletion = NO;
    glowFadeOutAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];


    [glowView.layer addAnimation:glowFadeOutAnim forKey:nil];
            glowView.layer.opacity = 0.0;
}

NSLog(@"glowView.opacity:%f",glowView.layer.opacity);
NSLog(button.selected ? @"YES" : @"NO");

}

4

1 に答える 1

1

glowViewボタンが押されるたびに新しいボタンを作成してボタンに追加すると、ボタンに追加されるボタンが増えるにつれて、明らかに明るくなり続けます。メソッドなどでglowView onceを作成し、viewDidLoadそれを失わないようにインスタンス変数として保存する必要があります。

@interface MyViewController : UIViewController {
    UIView *_glowView;
}

...

- (void)viewDidLoad {
    [super viewDidLoad];
    _glowView = ... // Initialise it here
    ...
    [imageView.superview insertSubview:_glowView aboveSubview:imageView];
}

次に、didTapButton:メソッドでタップを処理します(を追加または削除しますが、それへの参照が常に保持されるように_glowView設定しないでください)。nilこのように、一度作成して追加するだけで、問題は解決するはずです。

于 2013-07-18T05:30:02.677 に答える