私の質問は基本的に、 UITableCell で UILabel (および他の要素と思われる) の動的な高さをサポートし、回転時にラベルの幅/高さとセルの高さを正しくサイズ変更するための最良の方法に要約されます。
UILabels の予想される高さを取得し、それに応じて高さのサイズを変更する方法は認識していますが、横向きもサポートしている場合はかなり扱いにくいようです。
これはlayoutSubviewsのルートになる可能性があると考えていますが、それをセルの高さを計算する必要があるテーブルとどのように組み合わせるかはわかりません。別の興味深い投稿では、初期化時にフレームを手動で設定して、既知の量から計算を行っていることを確認していますが、それは問題の一部にしか対処していません。
赤い矢印は動的な高さのラベルを指し、青い矢印は高さを変更するセルを指しています。
私はそれを正しく機能させることができましたが、正しい方法かどうかはわかりません。
ここに私が学んだことのいくつかがあります:
- の cell.frame は、
cellForRowAtIndexPath
常にポートレート モードでのサイズを示します。(つまり、iPhone アプリの場合、常に 320 と報告されます)。 - 参照用のプロトタイプ セルをプロパティに保存すると、同じ問題が発生し、常に縦向きモードになります。
- ラベル幅のマスクの自動サイズ変更は、この使用例では役に立たないようであり、実際には、回転時に計算された高さに問題が発生します。
- の tableView.frame は
cellForRowAtIndexPath
、正しい向きでサイズを指定します [tableView reloadData]
ローテーションで呼び出す必要があります。セルとラベルの高さを更新する他の方法が見つかりませんでした
これを機能させるために私が取った手順は次のとおりです。
- 何らかの理由で適切なラベルの高さを取得するのを妨げるため、UILabels の自動サイズ変更マスクを無効にします。
各ラベル フォントへ
viewDidLoad
の参照と、縦向きの tableView と比較したラベル幅のパーセンテージのフロートを取得します。CWProductDetailDescriptionCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"DescriptionCell"]; self.descriptionLabelWidthPercentage = cell.descriptionLabel.frame.size.width / 320; self.descriptionLabelFont = cell.descriptionLabel.font;
では
heightForRowAtIndexPath
、tableView の幅と既に取得したパーセンテージを使用してセルの高さを計算します。case TableSectionDescription: CGFloat labelWidth = self.tableView.frame.size.width * self.descriptionLabelWidthPercentage; CGSize newLabelFrameSize = [self sizeForString:self.product.descriptionText WithConstraint:CGSizeMake(labelWidth, MAXFLOAT) AndFont:self.descriptionLabelFont]; return newLabelFrameSize.height + kTextCellPadding;
では
cellForRowAtIndexPath
、ラベル フレームのフレームを計算して更新します。cell = [tableView dequeueReusableCellWithIdentifier:@"DescriptionCell"]; ((CWProductDetailDescriptionCell *)cell).descriptionLabel.text = self.product.descriptionText; CGRect oldFrame = ((CWProductDetailDescriptionCell *)cell).descriptionLabel.frame; CGFloat labelWidth = self.tableView.frame.size.width * self.descriptionLabelWidthPercentage; CGSize newLabelFrameSize = [self sizeForString:self.product.descriptionText WithConstraint:CGSizeMake(labelWidth, MAXFLOAT) AndFont:((CWProductDetailDescriptionCell *)cell).descriptionLabel.font]; ((CWProductDetailDescriptionCell *)cell).descriptionLabel.frame = CGRectMake(oldFrame.origin.x, oldFrame.origin.y, labelWidth, newLabelFrameSize.height);
あなた
didRotateFromInterfaceOrientation
がする必要があります[self.tableView reloadData]
この方法の問題点:
- IB で設定する可能性のある自動サイズ変更マスクとマージンを活用することはできません
- ラベルの幅が縦方向と横方向で同じパーセンテージでない場合は、両方のパーセンテージを知る必要があります
- ラベルの幅のパーセンテージを知る/計算する必要があります。理想的には、自動サイズ変更マスクが処理を行った後、これらをオンザフライで計算できるようになります。
- 不器用な感じです。インデントのある編集モードでは、さらに頭が痛くなりそうな予感がします。
そう。これを行う正しい方法は何ですか?私は多くの SO の質問を見てきましたが、これを正確に扱っているものはありません。