デバイスをローテーとした場合には、UIViewControllerのサブクラスに shouldAutorotateToInterfaceOrientation のメッセージが送られます。
– (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
ここでNOを返してしまえば問題ありませんが、YESを返すと画面がローテートします。中には UIInterfaceOrientationPortrait しか対応していないアプリも多いように見えます。iPhoneやiPod Touchを使用していると UIInterfaceOrientationPortrait だけでも十分ですが、iPad(2を含む)ではどちらかというとLandscapeが一般的な気がします。
特にiPad2ではSmartCoverの関係で UIInterfaceOrientationLandscapeRight が一般的かなぁというのが私の感想です。(全く個人的な感想)
そこで困るのが、そのViewに表示している各表示項目の配置です。Portraitで一番下に表示していたもの等はLandscapeでは配置をかえてやる必要があります。
しかし各Viewにはローテートが発生したかどうかは伝わってきません。
そこで私が取っているのがUIViewの -(void)layoutSubviews の上書きです。
下記のようにLandscapeかどうかを判断して配置のしなおしをしています。
-(void)layoutSubviews {
NSInteger isLandscape;
UIApplication* app;
UIInterfaceOrientation orientaion;
CGRect f;
CGPoint p;
if(caloryLabel.text == nil || [caloryLabel.text isEqualToString:@””]) {
updateButton.enabled = NO;
}
app = [UIApplication sharedApplication];
orientaion = app.statusBarOrientation;
isLandscape = UIDeviceOrientationIsLandscape(orientaion);
switch (isLandscape) {
case YES:
f = label.frame;
f.size.width = 480 – 30;
foodNameLabel.frame = f;
f = label.frame;
「これで一安心」
と思っていたのですが、いくつかの部分で動かなくなってしまった機能がありました。その一つがUITableViewCellをサブクラス化した部分です。
いつの間にかswipeによるセルの削除などが出来なくなったのです。
最初は
– (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
あたりを疑ったのですが、らちがあきません。
結局たどり着いたのは先ほどの -(void)layoutSubviews です。
オリジナルのUITableViewCellでも使っていたのですね。
そこでこのメソッドの最後で
[super layoutSubviews];
と追加してやる事で問題は解決しました。
Leave a Reply