1

UITableViewCell複数のラベルと画像を使用してカスタムを設定し、 (最終的に)希望どおりに表示するようにしました。

ただし、選択範囲を希望どおりに表示する方法がわかりません。setSelected背景色を問題なく変更できるメソッドを実装しましたが、背景色を黒に設定し、選択したセルの左側に色付きの長方形を表示することをお勧めします (幅 10 ピクセル) およびセルの高さ)。

色付きのボックスはプログラムによって色が設定されるため、 を に簡単に設定できますがselectedBackgroundViewUIImageViewこの場合は機能しません。

次のコードはselectedViewColor UIView、セルが選択されているときに をまったく表示しません。

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    UIView *selectedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.selectedBackgroundView.bounds.size.width, self.selectedBackgroundView.bounds.size.height)];
    [selectedView setBackgroundColor:[UIColor blackColor]];

    UIView *selectedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, self.selectedBackgroundView.bounds.size.height)];
    [selectedViewColor setBackgroundColor:[UIColor redColor]];
    [selectedView addSubview:selectedViewColor];

    self.selectedBackgroundView = selectedView;

    [super setSelected:selected animated:animated];
}

このコードは非常に基本的なように見えるので、selectedBackgroundView.

代替案やアドバイスをいただければ幸いです。

4

4 に答える 4

4

このコードで改善できることがいくつかあります。setSelected メソッドで 2 つのビューを再初期化するのは、かなり非効率的です。このコードでセルを選択すると、実際にはセル内のすべてが空白になります(これはあなたが望むものではないと思います)。最後に、selectedBackgroundView を、セルを選択したときに表示される唯一のビューであるかのように扱っています (Apple のドキュメントによると、backgroundView のに表示されます)。

次を試してください(編集済み) -セルを作成する場所にこのコードを配置します(おそらくcellForRowAtIndexPath :)

UIView* container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cell.backgroundView.bounds.size.width, cell.backgroundView.bounds.size.height)]; // we need this because in cells, the background views always take up the maximum width, regardless of their frames.
container.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0]; // make it transparent - we only want the square subview to be seen.
UIView *selectedViewColor = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, self.selectedBackgroundView.bounds.size.height)];
[selectedViewColor setBackgroundColor:[UIColor redColor]];
[container addSubview:selectedViewColor]
cell.selectedBackgroundView = container;

これにより、セルが選択されたとき(およびそのときのみ)、セル内の他のビューの上に赤い四角が表示されます。Appleのドキュメントから:

UITableViewCell は、セルが選択されている場合にのみ、このプロパティの値をサブビューとして追加します。選択された背景ビューをサブビューとして、nil でない場合は背景ビュー (backgroundView) のすぐ上、または他のすべてのビューの背後に追加します。

次に、セルで次のコードを使用します。

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
   [super setSelected:selected animated:animated];
   if(selected == YES)
   {
      self.backgroundView.backgroundColor = [UIColor blackColor];
   }
   else
   {
      self.backgroundView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0] // replace this with whatever's appropriate - a return to the unselected state.
   }
}

これにより、セルが選択されたときに背景が確実に黒くなります (表示内容に干渉することはありません)。うまくいけば、これらの変更により、発生している問題も解決されるはずです。

于 2012-09-25T01:56:58.150 に答える
1

上記のXonoの回答に加えて、上記の回答に対する彼のコメントをフォローアップします。

このテーマを調査しているときに私が何度か遭遇したことの1つは、セルが選択されたときにUITableViewCellの背後にあるコードが実際にすべてのサブビューのbackgroundColorを透明に設定する可能性があることです。

セルのSelectionStyleがNone以外の場合は、実際にこれを行います。そして、それはとの両方の呼び出しでそれをsetHighlighted行います。setSelectedUITableViewCell

私の最初の解決策は、UITableViewCellをサブクラス化し、これらの両方のメソッドをオーバーライドすることでした。基本クラスのメソッドを呼び出したり、独自のアニメーションを実行したりすることはありませんでした。これは、現在(おそらくひどく)標準のiOSアニメーションを再実装しているため理想的ではありません。

さらに詳しく調べると、標準の方法では、サブビューではなく、ビュー全体の不透明度がアニメーション化されます(サブビューの色のみが設定されます)。したがって、最善のアプローチは、基本クラスのメソッドを呼び出してから、サブビューの色を元の色にリセットすることです。それらを瞬時に設定しても、それらのスーパービューはまだ不透明度をアニメートしているため、正しくフェードインおよびフェードアウトします。

    public override void SetHighlighted(bool highlighted, bool animated)
    {
        base.SetHighlighted(highlighted, animated);
        SelectedBackgroundView.Subviews[0].BackgroundColor = SelectionColor;
    }

    public override void SetSelected(bool selected, bool animated)
    {
        base.SetSelected(selected, animated);
        SelectedBackgroundView.Subviews[0].BackgroundColor = SelectionColor;
    } 

これはc#MonoTouchコードですが、obj-cにも同様に適用されます。
私の場合、常に正確に1つのサブビューがあるため、ハードコードされた0インデクサーであることに注意してください。これは、ビューの構造によって異なる場合があります。

于 2013-01-26T01:30:30.560 に答える