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];
画像でみるとこの様になります
そして同様のコードをiOS7で動かすと
この様に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];
これで動かすと
この様にUIActivityIndicatorViewが乗りました。
- iOS7以前でUIActivityIndicatorViewの領域分を確保する為にしていたmessageの改行を無くす
- UIActivityIndicatorViewStyleWhiteでは見難いのでUIActivityIndicatorViewStyleGrayへ変更する
等の細かい調整は必要になりますが、この回避方法でUIAlertViewに何かを乗せるUIは実現出来ます。
肝である[alert setValue:indicator forKey:@"accessoryView"];を本当に使っていいのかというのはあると思いますが、冒頭の通り自己責任で使って下さい。
参考(要ログイン):Apple DeveloperForums