UIViewのアニメーションで、LinerやEaseInを指定しても効かずEaseInOutする件

UIViewのblocksを使用したアニメーションで、LinerやEaseInを指定しているのに、なぜかEaseInOutになってしまうのでしばらく引っかかっていました。すごくくだらないことでしたが、海外に前例があったっぽいので一応日本語で残しておきます。

[UIView animateWithDuration:1.0f delay:0 options:UIViewAnimationCurveLinear animations:^(void) {
imageView.frame = newFrame;
} completion:nil];

こんな感じのコードがどうしても意図通りLinerの動きをせず、EaseInOutしてしまってました。

ずっと気づけなかったのですが、optionsの引数はUIViewAnimationOptionsですね。UIViewAnimationCurveではありませんでした。すごく似てるけど。

正解のコードはこうでした。

[UIView animateWithDuration:1.0f delay:0 options:UIViewAnimationOptionCurveLiner animations:^(void) {
imageView.frame = newFrame;
} completion:nil];

UIViewAnimationCurveLinearとUIViewAnimationOptionCurveLiner、似てて全然気づけなかった。optionsがおかしいとは思ったけど、なにか足りないんだと思っていろんなUIViewAnimationOptionをつけ加えてみてたり、特定デバイスや特定OSのバグかなとか思ったりまでしてしまった。

なんでEaseInOutしてたのかというと、

typedef enum {
UIViewAnimationCurveEaseInOut,         // slow at beginning and end
UIViewAnimationCurveEaseIn,            // slow at beginning
UIViewAnimationCurveEaseOut,           // slow at end
UIViewAnimationCurveLinear
} UIViewAnimationCurve;

UIViewAnimationCurveLinear (=3)が、

enum {
UIViewAnimationOptionLayoutSubviews            = 1 <<  0,
UIViewAnimationOptionAllowUserInteraction      = 1 <<  1, // turn on user interaction while animating
UIViewAnimationOptionBeginFromCurrentState     = 1 <<  2, // start all views from current value, not initial value
UIViewAnimationOptionRepeat                    = 1 <<  3, // repeat animation indefinitely
UIViewAnimationOptionAutoreverse               = 1 <<  4, // if repeat, run animation back and forth
UIViewAnimationOptionOverrideInheritedDuration = 1 <<  5, // ignore nested duration
UIViewAnimationOptionOverrideInheritedCurve    = 1 <<  6, // ignore nested curve
UIViewAnimationOptionAllowAnimatedContent      = 1 <<  7, // animate contents (applies to transitions only)
UIViewAnimationOptionShowHideTransitionViews   = 1 <<  8, // flip to/from hidden state instead of adding/removing
UIViewAnimationOptionCurveEaseInOut            = 0 << 16, // default
UIViewAnimationOptionCurveEaseIn               = 1 << 16,
UIViewAnimationOptionCurveEaseOut              = 2 << 16,
UIViewAnimationOptionCurveLinear               = 3 << 16,
UIViewAnimationOptionTransitionNone            = 0 << 20, // default
UIViewAnimationOptionTransitionFlipFromLeft    = 1 << 20,
UIViewAnimationOptionTransitionFlipFromRight   = 2 << 20,
UIViewAnimationOptionTransitionCurlUp          = 3 << 20,
UIViewAnimationOptionTransitionCurlDown        = 4 << 20,
UIViewAnimationOptionTransitionCrossDissolve   = 5 << 20,
UIViewAnimationOptionTransitionFlipFromTop     = 6 << 20,
UIViewAnimationOptionTransitionFlipFromBottom  = 7 << 20,
};
typedef NSUInteger UIViewAnimationOptions;

UIViewAnimationOptionsではUIViewAnimationOptionLayoutSubviews | UIViewAnimationOptionAllowUserInteraction (1+2=3)、という感じで、アニメーションパターンに関しては影響せず、デフォルトのEaseInOutしていたってことですね。

Block animation ignores UIViewAnimationCurveLinear – iPhone Dev SDK

スポンサーリンク

シェアする

フォローする

スポンサーリンク