iOS7でUIAlertViewにaddSubview出来ない問題を回避する方法

タイトルに偽りあり。

正確にはiOS7からaddSubviewが出来なくなった訳ではなく、しても無視されるようになっているようです。

UIAlertViewにUIActivityIndicatorViewとかUIImageViewを乗せたりするUIってよく見ますよね。これが禁止されるとキツい部分も多いと思います。

正直困るので、なんとか出来ないもんかと調べたりして一応の回避策は見つけました。

 

ただし、UIAlertViewに何かを乗せる行為自体Appleが嫌ってきている様ですし今後の動作は保証できません。また、この方法で申請をしてRejectされる可能性もあるかもしれませんので自己責任で行って下さい。

 

という訳で本題の回避方法です。

UIAlertViewにUIActivityIndicatorViewを乗せてみます

まずiOS7以前はこんな感じで乗せていたと思います

UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Alert"
                                               message:@"Indicatorを出したい\n\n\n"
                                              delegate:nil
                                     cancelButtonTitle:nil
                                     otherButtonTitles:@"OK", nil];
   
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
indicator.center = CGPointMake((self.view.bounds.size.width / 2) - 20, (self.view.bounds.size.height / 2) - 130);
[indicator startAnimating];
   
[alert addSubview:indicator];
[alert show];

画像でみるとこの様になります

f:id:ojukog:20131004212032j:plain

 

そして同様のコードをiOS7で動かすと

f:id:ojukog:20131004212049j:plain

この様にUIActivityIndicatorViewが乗っていません

 

なのでiOS7ではこんな感じで書いてみます

UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Alert"
                                               message:@"Indicatorを出したい"
                                              delegate:nil
                                     cancelButtonTitle:nil
                                     otherButtonTitles:@"OK", nil];
   
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
indicator.center = CGPointMake((self.view.bounds.size.width / 2) - 20, (self.view.bounds.size.height / 2) - 130);
[indicator startAnimating];
   
[alert setValue:indicator forKey:@"accessoryView"];
[alert show];

これで動かすと

f:id:ojukog:20131004212131j:plain

この様にUIActivityIndicatorViewが乗りました。

  • iOS7以前でUIActivityIndicatorViewの領域分を確保する為にしていたmessageの改行を無くす
  • UIActivityIndicatorViewStyleWhiteでは見難いのでUIActivityIndicatorViewStyleGrayへ変更する

等の細かい調整は必要になりますが、この回避方法でUIAlertViewに何かを乗せるUIは実現出来ます。

肝である[alert setValue:indicator forKey:@"accessoryView"];を本当に使っていいのかというのはあると思いますが、冒頭の通り自己責任で使って下さい。

 

参考(要ログイン):Apple DeveloperForums