web-dev-qa-db-ja.com

UITableViewCellは、強調表示されたときにラベルの背景を明確にします

プログラムで作成したUITableViewCellにUIlabelがあります(つまり、nibまたはサブクラスではありません)。

セルが強調表示される(青色になる)と、UILabelsのすべての背景色がクリアになります。 2つのUILabelsがあり、これが当てはまりません。現在、UILabelの背後にあるUIImageViewsを使用して、背景色が変化しないように見せています。しかし、これはそれを行うには非効率的な方法のようです。

UITableViewCellが強調表示されているときに、特定のUILabelの背景色の変更を停止するにはどうすればよいですか?

41
Jonathan.

UItableViewをサブクラス化し、透明な背景にしたくないビューのタグのリストを作成し、setHighlighted:animated:メソッドをオーバーライドして、特定のラベルの背景色をリセットする必要がありました。長い間そして正直なところ、UItableViewCellの実際のクラスにソースコードがあった場合に限ります。

0
Jonathan.

UITableViewCellをサブクラス化し、次の2つのメソッドをオーバーライドする必要があります。

Objective-C:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    UIColor *backgroundColor = self.myLabel.backgroundColor;
    [super setHighlighted:highlighted animated:animated];
    self.myLabel.backgroundColor = backgroundColor;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    UIColor *backgroundColor = self.myLabel.backgroundColor;
    [super setSelected:selected animated:animated];
    self.myLabel.backgroundColor = backgroundColor;
}

スウィフト

override func setSelected(_ selected: Bool, animated: Bool) {
    let color = myLabel.backgroundColor
    super.setSelected(selected, animated: animated)
    myLabel.backgroundColor = color
}

override func setHighlighted(_ highlighted: Bool, animated: Bool) {
    let color = myLabel.backgroundColor
    super.setHighlighted(highlighted, animated: animated)
    myLabel.backgroundColor = color
}
55
Vahan

ハイライトで背景色が変化しないようにする別の方法は、ラベル自体ではなく、ラベルのbackgroundColorlayerプロパティを設定することです。

#import <QuartzCore/QuartzCore.h>

...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // Get a table cell
    UITableViewCell *cell = [tableView dequeueReusableCellForIdentifier:@"cell"];

    // Set up the table cell
    cell.textLabel.text = @"This is a table cell.";

    // If you're targeting iOS 6, set the label's background color to clear
    // This must be done BEFORE changing the layer's backgroundColor
    cell.textLabel.backgroundColor = [UIColor clearColor];

    // Set layer background color
    cell.textLabel.layer.backgroundColor = [UIColor blueColor].CGColor;

    return cell;
}

layerは、セルの強調表示や選択の影響を受けません。

46
Tommy

または、色を変更したくないラベルをサブクラス化します。

@interface PersistentBackgroundLabel : UILabel {
}

- (void)setPersistentBackgroundColor:(UIColor*)color;

@end


@implementation PersistentBackgroundLabel

- (void)setPersistentBackgroundColor:(UIColor*)color {
    super.backgroundColor = color;
}

- (void)setBackgroundColor:(UIColor *)color {
    // do nothing - background color never changes
}

@end

次に、setPersistentBackgroundColor:を使用して、色を明示的に一度設定します。これにより、カスタムの明示的な背景色変更メソッドを使用せずに、どこからでも背景色が変更されるのを防ぐことができます。

これには、移行中にラベルの明確な背景を排除するという利点もあります。

40
user479821

私は間違っているかもしれませんが、Swiftの既存のゲッター/セッターを直接オーバーライドする方法を見つけることができませんでした。 user479821の答えを基に、望ましい結果が得られると思われる回避策を見つけました。ストーリーボードを使用する場合に備えて、IBDesignable/IBInspectableアノテーションを追加しました。ストーリーボードは、エディターでのレンダリングの最終色です。

@IBDesignable
class PersistentBackgroundLabel: UILabel {
    @IBInspectable var persistentBackgroundColor: UIColor = UIColor.clearColor() {
    didSet {
        super.backgroundColor = persistentBackgroundColor
    }
    }

    override var backgroundColor: UIColor? {
    didSet {
        if backgroundColor != persistentBackgroundColor {
            backgroundColor = persistentBackgroundColor
        }
    }
    }
}
5

同じ問題が発生しましたが、UIKitフレームワークのバグのようです。おかげで私は回避策を得ました:順序が重要です!!!シーケンスに従ってください:

- (void)tableView:(UITableView *)t willDisplayCell:(UITableViewCell*)c forRowAtIndexPath:(NSIndexPath *)i {
UIColor *bgc = [UIColor redColor];
// Set up the cell in following order:
c.textLabel.backgroundColor = bgc;
c.backgroundColor = bgc;
c.textLabel.text = @"foo";
}

理由はわかりませんが、このシーケンスは正常に機能し、他の順序では、セルの選択を解除した後、c.textLabel.backgroundColorが一部のセルでclearColorに強制されたかのように表示されます。

これはランダムな動作ではなく、セルが最初に再利用されたときに発生しました。セルが作成されたときでも、2回目に再利用されたときでもありません。回避策を使用すると、常に正常に動作します。

3
Pasky

背景色をlabel.layer.backgroundColorに設定すると、これを修正できます。

強調表示すると、セルがUILabelのbackgroundColorを変更するようです。

2
blunt sword

UILabelサブクラスでフラグを作成して、awakeFromNibまたはinitの後で背景色の変更を無効にします。これにより、ストーリーボードで設定された初期カラーが有効になります。また、追加のメソッドを呼び出す必要はありません。

@implementation MWPersistentBGLabel {
    BOOL disableBackgroundColorChange;
}

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setup];
    }
    return self;
}

- (void)awakeFromNib {
    [super awakeFromNib];
    [self setup];
}

- (void)setup {
    // disable background color change after setup is called
    disableBackgroundColorChange = YES;
}

// if we ever have to change the color later on, we can do so with this method
- (void)setPersistentBackgroundColor:(UIColor*)color {
    [super setBackgroundColor:color];
}

- (void)setBackgroundColor:(UIColor *)color {
    if (!disableBackgroundColorChange) {
        [super setBackgroundColor:color];
    }
    // do nothing - background color never changes
}

@end
1
Hlung

私のアプリでは、uitableviewcell選択スタイルの青色を変更する必要があったので、セルをクリックするとImageviewとして強調表示され、uiimageビューを設定する必要がありました。そして、ビューに戻ったときに、強調表示されているセルを削除しました。そして、私はあなたの問題を明確に理解できませんでした。だから私のコードを与えてこれを試してみてください、

   cellForRowAtIndexPath Method:

CGRect a=CGRectMake(0, 0, 300, 100);
UIImageView *bImg=[[UIImageView alloc] initWithFrame:a];
bImg.image=[UIImage imageNamed:@"bg2.png"]; 
[bImg setContentMode:UIViewContentModeScaleToFill];
cell.selectedBackgroundView=bImg;
[bImg release];


   -(void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:YES];

  NSIndexPath *deselect = [self.tableView indexPathForSelectedRow];
  [self.tableView deselectRowAtIndexPath:deselect animated:NO];

   }

ベストオブラック

0
Pugal