設定アプリケーションのwifi設定と同じようにUISegmentedControl
、グループに参加しようとしています。UITableViewCell
私が抱えている問題は、二重の境界線が表示されることです。の境界線を 1 つと の境界線を 1 つ取得UISegmentedControl
しUITableViewCell
ます。
から境界線を削除する必要があると思いますUITableViewCell
。どうすればそれを行うことができますか?
設定アプリケーションのwifi設定と同じようにUISegmentedControl
、グループに参加しようとしています。UITableViewCell
私が抱えている問題は、二重の境界線が表示されることです。の境界線を 1 つと の境界線を 1 つ取得UISegmentedControl
しUITableViewCell
ます。
から境界線を削除する必要があると思いますUITableViewCell
。どうすればそれを行うことができますか?
これがまだ答えを得ていることに気づきました。たまたま別のプロジェクトでこれをしなければならなかったのですが、この質問をして以来、iPhone dev についてさらに多くのことを学びました。これが私が最近それを解決した方法です。フレームを正しいサイズにすることがすべてです。これは、標準のテーブルに対して行う必要があります。
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];
if(cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"] autorelease];
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithFrame:CGRectMake(-1.0f, -1.0f, 302.0f, 46.0f)];
[cell.contentView addSubview:segmentedControl];
Wi-Fi設定の場合、彼らが行ったことは、「このネットワークを忘れる」ボタン、「IPアドレス」ラベル、および「DHCP/BootP/Static」セグメント化されたテーブルのすべての部分を制御することであると思われますヘッダー ビュー。テーブルの中央でこれを行う必要がある場合 (それぞれtableHeaderView
およびプロパティを使用する上部または下部とは対照的に)、 、または対応するバリアントでtableFooterView
デリゲート メソッド-tableView:viewForHeaderInSection:
を使用することをお勧めします。これらのいずれかを使用して、テーブル ビューのその「セクション」にカスタム ビューを設定し (クリアな背景色または を使用)、残りの部分と一致するように配置されたラベルとセグメント化されたコントロールを含みます。テーブルセクション。-tableView:heightForHeaderInSection
Footer
[UIColor groupTableBackgroundColor]
この投稿の手法を使用してUITableViewCellの背景の不透明度を削除すると、UISegmentedControlのみをテーブルの行に表示するのがより簡単になりました。
これで少し進みました。これまでのところ、UITableViewCell をサブクラス化しました。UISegmentedControl を含む nib を作成し、UITableViewCell の背景アルファを 0 に設定しました。まだ完全に正しくは見えませんが、以前よりは良くなっています。
私の解決策は、セグメント化されたコントロールが収まるようにサイズ変更できるようにし、テーブルビューの背景をtableView:willDisplayCell:forRowAtIndexPath:
.
これにより、レイアウト メトリックをハードコーディングせずに、「Settings.app > WiFi > Your Network > IP Address」セグメント化されたコントロールと同じ結果が得られます。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
}
UISegmentedControl *control = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]];
control.segmentedControlStyle = UISegmentedControlStylePlain;
control.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
control.frame = cell.contentView.bounds;
[cell.contentView addSubview:control];
[control release];
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.backgroundView.alpha = 0.0;
}
トリックは、UISegmentedControlのサイズをbackgroundView
コントロールのサイズではなく、コントロールのサイズにすることのようcontentView
です。次のようにして、プログラムでそれを行うことができました。
// Size to cover the entire background
self.contentView.frame = self.backgroundView.frame;
self.myControl.frame = self.contentView.bounds;
アクセサリを使用している場合は、 も考慮する必要があることに注意してくださいaccessoryView
。
その理由は、ビューの階層が次のようになっているためです。
self
( UITableViewCellまたはサブクラス)
backgroundView
contentView
accessoryView
縦向きレイアウトでは、backgroundView
のフレームは ですが{{9, 0}, {302, 44}}
、contentView
のフレームはわずかに小さく、{{10, 1}, {300, 42}}
です。これにより、テーブル スタイルがグループ化されている場合に、セルに 1 ピクセルの「境界線」が与えられます。contentView
適切なサイズを取得するには、とコントロールの両方のサイズを変更する必要があります。
(注: Apple は実際にはSDKのUICatalogサンプル コード プロジェクトにUISegmentedControlの例をいくつか持っていますが、 UIViewControllerを使用してメイン ビューの背景色をテーブルの背景色に設定することで、効果的に「ごまかしています」。)