プログラムで作成したUITableViewCellにUIlabelがあります(つまり、nibまたはサブクラスではありません)。
セルが強調表示される(青色になる)と、UILabelsのすべての背景色がクリアになります。 2つのUILabelsがあり、これが当てはまりません。現在、UILabelの背後にあるUIImageViewsを使用して、背景色が変化しないように見せています。しかし、これはそれを行うには非効率的な方法のようです。
UITableViewCellが強調表示されているときに、特定のUILabelの背景色の変更を停止するにはどうすればよいですか?
UItableViewをサブクラス化し、透明な背景にしたくないビューのタグのリストを作成し、setHighlighted:animated:メソッドをオーバーライドして、特定のラベルの背景色をリセットする必要がありました。長い間そして正直なところ、UItableViewCellの実際のクラスにソースコードがあった場合に限ります。
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
}
ハイライトで背景色が変化しないようにする別の方法は、ラベル自体ではなく、ラベルのbackgroundColor
にlayer
プロパティを設定することです。
#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
は、セルの強調表示や選択の影響を受けません。
または、色を変更したくないラベルをサブクラス化します。
@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:を使用して、色を明示的に一度設定します。これにより、カスタムの明示的な背景色変更メソッドを使用せずに、どこからでも背景色が変更されるのを防ぐことができます。
これには、移行中にラベルの明確な背景を排除するという利点もあります。
私は間違っているかもしれませんが、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
}
}
}
}
同じ問題が発生しましたが、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回目に再利用されたときでもありません。回避策を使用すると、常に正常に動作します。
背景色をlabel.layer.backgroundColorに設定すると、これを修正できます。
強調表示すると、セルがUILabelのbackgroundColorを変更するようです。
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
私のアプリでは、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];
}
ベストオブラック