2013-10-25 8 views
5

UITableViewCellカスタムサブタイトルにあるラベルの束のサイズを計算する方法があります。これはUIPopoverControllerです。ユーザーがデバイスを回転させると、サイズを再計算し、テーブルを再描画して新しいサイズを使用する必要があります。ローテーションを検出しようとしたすべての方法は、価値が下がっているか、呼び出されていないか、適切なタイミングで呼び出されません。デバイスが回転してサイズを再計算できるときに自動的に呼び出されるメソッドはありますか?iOS 7のローテーションでサブビューサイズを再計算


編集:私は試してみましたが、なぜそれが動作しないもの:

  • shouldAutorotate - 呼び出されません - どうやら減価償却。
  • layoutSubviews - 呼び出されますが、私はここで[self.tableView reloadData]しようとすると、私は無限ループにUIDeviceOrientationDidChangeNotificationため
  • NSNotificationCenterオブザーバー立ち往生 - 私のコントローラは、それが新しい次元だ知っているので、私はここに
  • を私のサイズを再計算することはできません前に呼び出されますが
  • [self.tableView setNeedsDisplay]layoutSubviews - 表の再描画を促しません。
  • didRotateFromInterfaceOrientation - 呼び出されません - 明らかに償却されます。

編集2:私は

をやろうとしているかについての詳細は、私が「行-と-列」スタイルテーブルを模倣しようとしている、と模倣するラベルをラインアップしています列。サイズを再計算すると、テーブルのすべての行をループし、その行の各「列」をループします。私は各列の幅を取得し、各列のすべての行の最大幅を追跡します。次に、幅とフォントサイズの間隔を操作して、すべての列に最も広いラベルがある行が画面に収まるようにします。

+0

layoutSubviews? – ChrisH

+0

あなたはどの方法を試しましたか? shouldAutorotateは推奨されていません。 –

+0

@ChrisH:私はそこに置くことができますが、 '[self.tableView reloadTable];を試そうとすると、無限ループに陥ります。 – GeneralMike

答えて

1

セル内の実際のレンダリングされたUILabelsに頼って、 "列"の幅を計算することは望ましくありません。代わりに、次の操作を行います。

  1. UIInterfaceOrientation取るcalculateColumnWidthsForInterfaceOrientation:というメソッドを実装します。この方法では、UIInterfaceOrientationIsLandscape(orientation)を使用して、要求された方向が縦または横であるかどうかを確認します。次に、向きに基づいて、ラベルに表示するデータを調べ、NSStringのsizeWithAttributes:メソッド(またはその派生物の1つ)を使用して最も幅の広い列幅を見つけます。それらの値を配列などにキャッシュします。
  2. 希望の列幅を使用するカスタムテーブルビューセルにsetColumnWidths:のようなメソッドを追加します。
  3. tableView:cellForRowAtIndexPath:メソッドでは、キャッシュされた列の幅を取得し、setColumnWidths:メソッドを使用してセルに設定します。
  4. セルでは、設定したばかりの列幅を使用してラベルをレイアウトします。
  5. ビューコントローラで、didRotateFromInterfaceOrientation:を実装します。その中にcalculateColumnWidthsForInterfaceOrientation:と指定の方向で電話をしてください。[self.tableView reloadData]
  6. 最後に、viewDidLoadには、最初のローテーションの前にデータの初期設定を行うには[self calculateColumnWidthsForInterfaceOrientation:self.interfaceOrientation]に電話してください。

これはすべきことです。

更新: あなたセルの幅の合計は、あなたのテーブルビューの合計幅と同じでなければなりません。それは、自動レイアウトまたは他の手段で管理することができます。そのサイズはセルのフレームサイズに反映されます。

アップデート2: 我々はポップオーバーについて話しているので、あなたは多分、単にwillRotateToInterfaceOrientation:duration:にポップオーバーを閉じ、その後、回転がdidRotateFromInterfaceOrientation:で行われた後、あなたの新しい所望の寸法に再びそれを表示することができます。 layoutSubviewsで

+0

これのほとんどは私がすでにやっていることです。 'sizeWithFont:'は減価償却されているので、 'UILabels'をレンダリングして列の幅を計算する必要があります。向きに応じてセルの総幅をどのように計算するのですか?(私のOPに関するRahulVyasのコメントへの私の反応を見てください)。また、 'didRotateFromInterfaceOrientation'は、減価償却されたローテーションメソッドのもう一つです。私は元の質問である"ローテーションをどうやって検出するのですか "に戻ります。私は 'didRotateFromInterfaceOrientation'を私のOPで動作しないもののリストに追加します。 – GeneralMike

+0

あなたは 'sizeWithFont:'メソッドについては正しいです: 'sizeWithAttributes:'に変更しました。しかし、私は 'didRotateFromInterfaceOrientation:'は非難されているとは思わない。ドキュメントやヘッダーで何も見つかりませんでした。私は私の答えに別のアップデートを加えました。 –

+0

私は 'didRotateFromInterfaceOrientation:'を試してストッパを置いた。それは呼び出されない(少なくともシミュレータ上では、おそらくこれはシミュレータだけのバグだろう?)。 – GeneralMike

1

はCustomCell.m、例えばサブビューつのセル

を再計算してみてください

- (void)layoutSubviews 
{ 

UIViewController *viewController = (id)[(AppDelegate *)[UIApplication sharedApplication].delegate window].rootViewController; 

if (UIInterfaceOrientationIsPortrait(viewController.interfaceOrientation)) 
    self.backgroundColor = [UIColor redColor]; 
else 
    self.backgroundColor = [UIColor greenColor]; 

}

+0

うーん、私はこれが私が探しているものに近いものだとは思わない。試してくれてありがとう。 – GeneralMike

0

あなたのtableViewと細胞を定義するために自動レイアウトを使用して考えがありますか?デバイスの回転時にセルレイアウトを更新するには、updateConstraintsと一緒に適切な制約を使用すると役立ちます。この方法では、各「列の」ラベルのpreferredMaxLayoutWidthを設定し、制約や方向に関係なく適切な水平パディングを処理するための制約を定義できます。

また、iOS 7を使用している場合は、バーボタン項目からポップオーバーを提示しない限り、回転時にサブビューのレイアウトを処理するためにpopoverController:willRepositionPopoverToRect:inView:を実装する必要があります。私はレビューをお勧めしますUIPopoverController Class Reference

関連する問題