6

UITableViewCellサブクラスlayoutSubviewsでは、いくつかのサブビューのフレームを計算する必要があるため、オーバーライドします。私のすべての計算のベースは、コンテンツビューの幅です。これは私の実装の始まりがどのようにlayoutSubviews見えるかです:

- (void) layoutSubviews
{
  [super layoutSubviews];  // invoke this to set up the content view's bounds

  CGFloat contentViewWidth = self.contentView.bounds.size.width;

  [...]  // calculate and assign frames to subviews
}

iPhoneシミュレーターのグループ化されたテーブルビューでこれをテストし始めました。セルは、コンテンツビュー内にあるものだけで構成されているはずです。つまり、周囲の凝ったものをすべてオフにしました。具体的には、アクセサリタイプをに設定して、アクセサリビューを無効にしましたUITableViewCellAccessoryNone。このため、アクセサリビューは非表示になっていますが、その境界/フレームプロパティは引き続き20/20のサイズを報告します。

これらすべてと次の簡単な図に基づいて、上記のコードスニペットのコンテンツビューの幅は300と報告されると思います。

<----------- screen width = 320 ----------->
+------------------------------------------+
|                                          |
|    <--- content view width = 300 --->    |
|    +--------------------------------+    |
|<-->|         table view cell        |<-->|
| 10 +--------------------------------+ 10 |
|                                          |
|                  [...]                   |

しかし、そうではありません。実際に報告されるコンテンツビューの幅は270です。

少し調べてみると、30個の欠落しているポイントは、a)アクセサリビューの幅20個、およびb)コンテンツビューとアクセサリビューの間の間隔10個で構成されています。アクセサリビューのサイズを0/0に設定してみたところ、コンテンツビューの幅が290と報告されるようになりました。少し良くなりましたが、それでも10ポイントずれています。accessoryViewプロパティをに設定しようとしましnilたが、ビューはによって再作成され[super layoutSubviews]ます。

最後に、質問:アクセサリビューを実際に無効にして、コンテンツビュー幅の計算に含まれないようにする方法はありますか?または、呼び出しをスキップして[super layoutSubviews]、幅を自分で計算するだけでも安全ですか?

4

1 に答える 1

10

この質問を再検討した後、質問で説明されている動作を再現できなくなっていることがわかりました。動作は期待どおりになりました。

  • テーブルビューセルのデフォルトのアクセサリスタイルは次のとおりです。UITableViewCellAccessoryNone
  • accessoryViewプロパティは戻りますnil
  • コンテンツビューの幅は302として報告されます

私は現在、iPhone5.1シミュレーターのXcode4.2でこれをテストしています。私が質問をしたとき、私はまだiPhone4.3シミュレーターを実行していると思います。ここで、問題は4.3シミュレーターにのみ存在するか、Xcodeの構成ミスが原因であるか、そもそも完全に想像上のものであると想定する必要があります。

記録のために:私の回避策は、コンテンツビューに新しい幅を適用することでしたlayoutSubviews

- (void) layoutSubviews
{
  [super layoutSubviews];

  CGRect contentViewFrame = self.contentView.frame;
  contentViewFrame.size.width = 302;
  self.contentView.frame = contentViewFrame;

  [...]
}
于 2012-12-23T21:44:36.343 に答える