もっと、みやびちゃんぷりちー!

みやびちゃんぷりちー!

iOS 5からのUIActivityIndicatorViewの変更

iOS 5からUIActivityIndicatorViewのサイズ指定で変更があったようです。

UIActivityIndicatorViewStyleでactivityIndicatorViewStyleを設定した際は以下のサイトで書かれている通りのサイズで従来と変わりません。

Good night, Posterous

  • UIActivityIndicatorViewStyleWhite: 21x21 px
  • UIActivityIndicatorViewStyleGray: 21x21 px
  • UIActivityIndicatorViewStyleWhiteLarge: 36x36 px

但し、上記以外で任意のサイズにする際、iOS 4までは以下のようなコードで良かったのですが、

UIActivityIndicatorView* indicator = [[UIActivityIndicatorView alloc] initWithFrame:self.view.bounds] autorelease];
indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
indicator.frame = CGRectMake(0, 0, 50, 50);

上記コードですと、iOS 5ではインジケータのサイズがUIActivityIndicatorViewStyleWhiteLargeのままになってしまいます。

解決策としては以下のサイトを参考にすると解決します。

UIActivityIndicatorView is too large in iOS 5 · Issue #34 · myell0w/MTStatusBarOverlay · GitHub

UIActivityIndicatorView* indicator = [[UIActivityIndicatorView alloc] initWithFrame:self.view.bounds] autorelease];
indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
[indicator.layer setValue:[NSNumber numberWithFloat:1.39f] forKeyPath:@"transform.scale"]; // 50pxに近くするため

但し、このコードですと、iOS 4で走らせた時のインジケータの表示が大きくなりすぎる問題を抱えてしまいます。

ですので、iOS 5以降か否かでインジケータのサイズ指定を変えてやります、

UIActivityIndicatorView* indicator = [[UIActivityIndicatorView alloc] initWithFrame:self.view.bounds] autorelease];
indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 
if (version < 5)
    indicator.frame = CGRectMake(0, 0, 50, 50);
else
    [indicator.layer setValue:[NSNumber numberWithFloat:1.39f] forKeyPath:@"transform.scale"];

こうすれば、iOS 5以降と前でのインジケータの任意サイズ指定が可能となります。

サンプルは後程。

追伸
来月からはObjective-Cのコードを書く機会が減りそうです。
詳細は後日。