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]
、幅を自分で計算するだけでも安全ですか?