UITableViewCellをカスタマイズする(の続き)

デバイスをローテーとした場合には、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

Your email address will not be published. Required fields are marked *

*

CAPTCHA


WP-SpamFree by Pole Position Marketing