iOS: использование UIAppearance для определения пользовательского цвета UITableViewCell - PullRequest
22 голосов
/ 29 ноября 2011

Если я установлю атрибут backgroundColor для сгруппированного UITableViewCell, цвет фона успешно изменится.Отлично.

Но я бы хотел использовать UIAppearance для изменения цвета фона на всех моих UITableViewCells, чтобы я мог делать это в одном месте и влиять на изменения повсюду.Вот мой код:

[[UITableViewCell appearance] setBackgroundColor:[UIColor colorWithRed:30.0/255.0 green:30.0/255.0 blue:30.0/255.0 alpha:1.0]];

UITableViewCell реализует UIAppearance и UIAppearanceContainer, поэтому я бы подумал, что это будет работать.Но это не так.Я также пытался использовать -[UITableViewCell appearanceWhenContainedIn:(Class)], и это тоже не работает.

Есть идеи?

Ответы [ 4 ]

41 голосов
/ 30 ноября 2011

Обновление (2013/7/8) - это было исправлено в более новых версиях iOS. Однако стоит знать, ориентируетесь ли вы на iOS 6 или ниже.

Вы можете обвинить Apple в этом, и это на самом деле довольно жестоко с их стороны. Технически , backgroundColor не настраивается через прокси внешнего вида.

Из документации Apple:

Для поддержки настройки внешнего вида класс должен соответствовать протоколу UIAppearanceContainer, а соответствующие методы доступа должны быть помечены как UI_APPEARANCE_SELECTOR.

Если мы войдем в класс, подобный UIBarButtonItem, и посмотрим на свойство tintColor, то увидим следующее:

@property(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR;

Так как он помечен тегом UI_APPEARANCE_SELECTOR, мы знаем, что он работает с UIAppearance.

Вот где Apple имеет особое значение: в UIView, backgroundColor не имеет тега выбора внешнего вида, но все еще работает с UIAppearance. В соответствии со всей документацией, Apple не должна этого делать, но, тем не менее, это так!

Это создает ложное впечатление, что оно будет работать для всех подклассов UIView, включая UITableView. Это уже упоминалось, в этом предыдущем ответе SO

Итак, суть в том, что backgroundColor вообще не должен работать с UIAppearance, но по какой-то причине он работает на UIView. Не гарантируется работа на UIView подклассах, и она вообще не работает на UITableView. Извините, я не могу дать вам более положительный ответ!

17 голосов
/ 06 января 2012

Вы можете создать свой собственный подкласс UITableViewCell, который соответствует UIAppearance и пометить пользовательский установщик UI_APPEARANCE_SELECTOR. Затем установите ячейку backgroundColor для суперкласса из пользовательского установщика.

В вашем приложении Delegate

[[CustomCell appearance] setBackgroundCellColor:[UIColor redColor]];

В вашем подклассе UItableView

@interface CustomCell : UITableViewCell <UIAppearance>

@property (nonatomic, weak) UIColor *backgroundCellColor UI_APPEARANCE_SELECTOR;

@implementation CustomCell

@synthesize backgroundCellColor;

-(void)setBackgroundCellColor:(UIColor *)backgroundColor
{
    [super setBackgroundColor:backgroundColor];
}

В этом примере я использую ARC.

3 голосов
/ 07 сентября 2014

Без подклассов ! Выполнение этого на подклассе, вероятно, НЕ лучшая практика, особенно если вы хотите использовать все фоны tableView.Это много подклассов.Много потенциальных ошибок.Беспорядок действительно.Лучший способ сделать это - использовать категорию.Вам нужно будет установить его как для tableViewCell, так и для tableView.Я просто продемонстрирую один для клетки.Свойство tableView, которое вы должны сделать, является свойством backgroundColor.NB.Я добавляю свои методы к "sat".

// .h

    #import <UIKit/UIKit.h>

@interface UITableViewCell (Appearance)<UIAppearance>
@property (strong, nonatomic) UIColor *satBackgroundColor UI_APPEARANCE_SELECTOR;
@end

// .m

#import "UITableViewCell+Appearance.h"

@implementation UITableViewCell (Appearance)

- (UIColor *)satBackgroundColor
{
    return self.backgroundColor;
}

- (void)setSatBackgroundColor:(UIColor *)satBackgroundColor
{
    self.backgroundColor = satBackgroundColor;
}


@end

Теперь в вашем appDelegate или в каком-то менеджереКласс, вы импортируете категорию и просто вызываете ее, как если бы она имела встроенный прокси внешнего вида.

UITableViewCell *cell = [UITableViewCell appearance];
cell.satBackgroundColor = [UIColor orangeColor];

Хорошо, так что теперь просто сделайте один для свойства background tableView.Простой.

0 голосов
/ 11 июня 2013

Я использовал категорию для этого.Ниже приведен пример кода. В вашем .h файле напишите

*@interface UITableViewCell (MyCustomCell)
@property (nonatomic, weak) UIColor *backgroundCellColor UI_APPEARANCE_SELECTOR;
@end*

В вашем .m файле напишите

*@dynamic backgroundCellColor;
-(void)setBackgroundCellColor:(UIColor *)backgroundColor
{
    [super setBackgroundColor:backgroundColor];
}*

Это хорошо сработало для меня.:) Спасибо, Нейт !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...