7

プロジェクトに単純なカスタム UITableViewCell があり、テーブルに編集アクションを追加しました。すべて問題ないように見えますが、編集時にインデントが機能せず、編集アイコンがコンテンツと重なっています。(削除ボタンは言うまでもありません)

カスタムセルでインデントが機能しない
カスタムセルは、通常どおり標準の制約を使用してインターフェイスビルダーで作成され、他の場所で次のようにうまくいかないことで述べられているように、クラスの layoutSubviews メソッドをオーバーライドしようとしました。

(void)layoutSubviews
{
[super layoutSubviews];
float indentPoints = self.indentationLevel * self.indentationWidth;

self.contentView.frame = CGRectMake(
                                    indentPoints,
                                    self.contentView.frame.origin.y,
                                    self.contentView.frame.size.width - indentPoints,
                                    self.contentView.frame.size.height
                                    );
}

また、サブビューが実際には contentView 内にあり、View と Code ですべて問題ないように見えることも確認しました。

セルには indentationLevel/Width もプログラムで設定され、マスクは自動幅に自動サイズ変更されます。

最後の手段として、プログラムで UITableViewCell を作成できますが、それが役立つとは思いません。

推奨に従って、セルコンテンツの制約がスーパービューに固定されていることも確認しました。

左余白を固定

また、運が悪いコードで自動ResizingMasksを手動で設定します

- 編集:

contentView の背景色を手動で黒に設定しましたが、「layoutSubviews」をオーバーライドしなくても、編集モードで正しくインデントされていることがわかりました。実際、それよりもうまく機能します。

ここに画像の説明を入力

ただし、ご覧のとおり、コンテンツはインデントされていません。最初は、セル (UIImage) の内容は contentView のサブビューではないと思いましたが、サブビューを nslogging すると、それらがそうであることがわかります。

NSLog(@"%@", self.contentView.subviews);

"<UIImageView: 0xa477030; frame = (23 7; 31 50); autoresize = TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0xa477090>>"

なぜこれがここで起こり続けるのか、私は完全に迷っています。iOS 6 の新しい制約に関連する隠れた制約である必要があります。

4

4 に答える 4

17

インデントは、編集モードに入るときにコンテンツビューを調整することと同じではありません。

そうです、これは単純なようで、通常は箱から出してすぐに機能します。通常、変更する必要があるのは、セルに追加するコンポーネントの自動サイズ変更マスクだけです。左側のコンテンツには固定の左マージンが必要であり、右側のコンテンツには固定の右マージンが必要です。

セルが編集モードに入ると、コンテンツビューのサイズが調整され、編集アクセサリ用のスペースが確保されます。コンテンツにこれらのサイズ変更マスクがある場合、これと一緒に移動します。上記のlayoutSubviewsメソッドは、インデントを誤って使用しているため、コンテンツビューを全幅に戻すことで、これらすべてを元に戻す可能性が非常に高くなります。ただし、質問の情報からはわかりません。

アップデート

これは、UITableViewCellsの制約に関する問題(バグ?)です。ストーリーボード/インターフェイスビルダー画面で[ファイル]タブを選択し(他の場所で制約を使用する場合は、セルにスタンドアロンのペン先を使用する)、[自動レイアウトを使用する]をオフにすることで、マスクの自動サイズ変更に戻ることができます。

ここに画像の説明を入力してください

これにより、セルのコンテンツが適切に配置されます。

于 2012-10-11T06:50:16.907 に答える
0

これらの機能を試して、回避することができます。

- (void)willTransitionToState:(UITableViewCellStateMask)state {
 [super willTransitionToState:state];

 if ((state & UITableViewCellStateEditingMask) || (state & UITableViewCellStateShowingDeleteConfirmationMask)) {
  [UIView beginAnimations:nil context:NULL];
  [UIView setAnimationDuration:0.3];
  label.alpha = 0.0;

//LayoutSubviewコード[UIViewcommitAnimations]; }}

- (void)didTransitionToState:(UITableViewCellStateMask)state {
 [super didTransitionToState:state];

 if (!(state & UITableViewCellStateEditingMask) && !(state & UITableViewCellStateShowingDeleteConfirmationMask)) {
  [UIView beginAnimations:nil context:NULL];
  [UIView setAnimationDuration:0.5];
  label.alpha = 1.0;
// LayoutSubview code
  [UIView commitAnimations];
 }
}
于 2012-10-11T06:50:09.180 に答える
0

tableView エッジ インセットをゼロに設定します

[self.tableView setSeparatorInset:UIEdgeInsetsZero];
于 2014-07-24T06:18:53.190 に答える
0

「自動レイアウトを使用」のチェックを外すとうまくいきました。

于 2013-04-21T09:19:59.163 に答える