7600


現在、ボタンの選択時の動作について作成しています。

[やりたいこと]  
あるボタンを選択したときに、UIButtonの各layerプロパティ値をアニメーションで変更したいと考えています。

[現状]  
以下のコードで実行したところ、delay、animateWithDurationをまたずに、プロパティ値が設定されてしまいます。

[環境]  
XCode 6.0.1  
iOS 6.0以上

こちらの現象の解決方法について、ご教示いただけるとありがたいです。

[code]

    #import <QuartzCore/QuartzCore.h>
    
    /*-------------------------------------------------------------------*/
    
    [UIView animateWithDuration:2.5f // アニメーション速度2.5秒
                          delay:1.0f // 1秒後にアニメーション
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         //ボタンA
                         buttonA.layer.borderColor = [UIColor blackColor].CGColor;
                         buttonA.layer.borderWidth = 1.0f;
                         buttonA.layer.cornerRadius = 25.0f;
                     } completion:^(BOOL finished) {
                         // アニメーション終了時
                         NSLog(@"アニメーション終了");
                     }];
    
[/code]

よろしくお願いします。


CC BY-SA 3.0
2015-03-08T04:28:08.117
7598
2015-03-08T05:04:11.110
2015-03-08T05:00:36.137
711
711
question
ios objective-c iphone
UIButtonの外枠のプロパティ値をアニメーションで変更する方法について


`Layer-Backed
View`なiOSだと混同しがちですが、`UIView`に対するアニメーションと、`CALayer`に対するアニメーションは別物です。

`animateWithDuration:`系統のメソッドは、`UIView`に対するアニメーションを行います。このとき、操作可能なプロパティには制限があります。[iOS
View
プログラミングガイド](https://developer.apple.com/jp/documentation/ViewPG_iPhoneOS.pdf)より、「アニメーション化の対象」の章を参照ください。

`CALayer`の`borderColor`などに対してアニメーションを行う場合は、[Core Animation
プログラミングガイド](https://developer.apple.com/jp/documentation/CoreAnimation_guide.pdf)より、レイヤベースのアニメーションを記述する必要があります。

例えば、以下のようなコードになります。

[code]

    CABasicAnimation *borderColorAnimation = [CABasicAnimation animationWithKeyPath:@"borderColor"];
    borderColorAnimation.fromValue = (id)[UIColor clearColor].CGColor;
    borderColorAnimation.toValue = (id)[UIColor blackColor].CGColor;
    
    CABasicAnimation *borderWidthAnimation = [CABasicAnimation animationWithKeyPath:@"borderWidth"];
    borderWidthAnimation.fromValue = @0.f;
    borderWidthAnimation.toValue = @1.f;
    
    CABasicAnimation *cornerRadiusAnimation = [CABasicAnimation animationWithKeyPath:@"cornerRadius"];
    cornerRadiusAnimation.fromValue = @0.f;
    cornerRadiusAnimation.toValue = @25.f;
    
    CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
    animationGroup.beginTime = CACurrentMediaTime() + 1.0;
    animationGroup.duration = 2.5;
    animationGroup.repeatCount = 1;
    animationGroup.removedOnCompletion = NO;
    animationGroup.fillMode = kCAFillModeForwards;
    animationGroup.animations = @[borderColorAnimation, borderWidthAnimation, cornerRadiusAnimation];
    [self.button.layer addAnimation:animationGroup forKey:@"animation"];
    
[/code]


CC BY-SA 3.0
2015-03-08T05:04:11.110
7600
2015-03-08T05:04:11.110
5337
7598
answer