Подтвердить что ты не робот

UITableViewCell делает ярлык ярлыка при выделенном

У меня есть UIlabel на UITableViewCell, который я создал программно (т.е. ни один ниб или подкласс).

Когда ячейка подсвечивается (идет синим цветом), она делает все цвета фона в UILabels ясными. У меня есть 2 UILabels, где я не хочу, чтобы это было так. В настоящее время я использую UIImageViews за UILabel, чтобы он выглядел так, как цвет фона не меняется. Но это кажется неэффективным способом сделать это.

Как я могу остановить определенный цвет фона UILabel, когда подсвечивается UITableViewCell?

4b9b3361

Ответ 1

Мне пришлось подклассифицировать UItableView, создать список тегов представления, который я хочу сделать не прозрачным, и переопределить метод setHighlighted: animated: так, чтобы он reset цвет фона конкретных меток. longwinding и fidely, если только у меня был исходный код t фактический класс UItableViewCell.

Ответ 2

Другой способ не менять цвет фона при настройке - установить свойство 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 background color to clear
    // This must be done BEFORE changing the layer backgroundColor
    cell.textLabel.backgroundColor = [UIColor clearColor];

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

    return cell;
}

layer не влияет на выделение или выделение ячейки.

Ответ 3

Альтернативно подклассу ярлыка, который вы не хотите менять цвет:

@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:. Это предотвратит изменение цвета фона из любой точки, не используя свой собственный метод изменения цвета фона.

Преимуществом этого является также устранение четкого фона в метке во время переходов.

Ответ 4

Вам нужно подклассифицировать UITableViewCell и переопределить следующие два метода:

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;
}

Swift

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

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

Ответ 5

Я могу ошибаться, но я не мог найти, чтобы напрямую переопределить существующий геттер/сеттер в 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
        }
    }
    }
}

Ответ 6

У меня такая же проблема, и я думаю, что это своего рода ошибка UIKit framework. Слава богу, у меня есть обходное решение. Просто следуйте последовательности:

- (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 был вынужден очиститьColor в некоторых ячейках после их отмены.

Это было не случайное поведение, это произошло в первый раз, когда ячейки были повторно использованы, а не когда они были созданы, и когда они были вторично использованы повторно. При обходном пути он отлично работает.

Ответ 7

Установите цвет фона в label.layer.backgroundColor, чтобы исправить это.

Кажется, ячейка изменит backgroundColor UILabel при подсветке.

Ответ 8

Я просто создаю флаг в подклассе 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

Ответ 9

В моих приложениях мне пришлось изменить стиль выбора стиля uitableviewcell, поэтому мне пришлось установить представление 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];

   }

Лучшее счастье

Ответ 10

Я не мог принять принятый ответ на работу; не так, я думаю, что ответ неверен (далек от него - кажется, это правильный путь), но когда я писал свое первое приложение iOS, моя голова уже вращалась с подклассами. Поэтому я решил обмануть.

Скажем, пользовательская ячейка управляется классом TableViewCell. Я создал один пиксельный .png файл с правильным цветом фона и создал объект UIImageView в моей пользовательской ячейке. Я использовал инспектор атрибутов для установки изображения по умолчанию и использовал "Scale To Fill". Для немного более привлекательной визуализации, я добавил следующее к атрибутам Runtime User Defined Runtime в Инспекторе идентификации:

KeyPath                Type         Value
layer.cornerRadius     Number       4
layer.masksToBounds    Boolean      YES

Voilá, округлые углы по дешевке.

Расположен прямо за UILabel, он выглядит как бизнес, хотя он, очевидно, не будет изменять размер содержимого (поскольку единственным контентом является его собственный образ). Не проблема для меня, так как данные, которые должны отображаться, должны были быть фиксированным размером в любом случае.

В некоторых значениях было хорошо иметь другой цвет, который можно легко установить:

cell.deviceDetailBackground.image = [UIImage imageNamed:@"detailBackground2.png"];

Где "ячейка" - это воплощение моей пользовательской ячейки в методе cellForRowAtIndexPath, созданная с помощью TableViewCell *cell;. Нет данных для отображения?

cell.deviceDetailBackground.image = nil;

Я уверен, что будет веская причина, почему это глупая идея, но поскольку я только начинаю с разработки iOS, это было легкое решение, которое сработало для меня. Не стесняйтесь говорить мне, почему бы не сделать это!