UITableViewHeaderFooterView в iOS 8
У меня есть UITableViewHeaderFooterView, в котором я меняю шрифт textLabel и цвет фона
UITableViewHeaderFooterView* header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"header"];
if(!header)
{
header = [[UITableViewHeaderFooterView alloc] initWithReuseIdentifier:@"header"];
[header.textLabel setFont:[UIFont boldSystemFontOfSize:15]];
[header.contentView setBackgroundColor:[UIColor colorWithRed:213/255.0 green:213/255.0 blue:213/255.0 alpha:1]];
}
Вот как iOS 7 показывает это:
Вот как iOS 8 показывает это:SetFont: здесь, кажется, не действует, или шрифт 15pt на iOS 8 больше, чем на iOS 7
Вот как iOS 8 показывает это, когда я удаляю вызов setFont:
Как вы можете видеть, setFont не влияет на шрифт, но влияет на textColor.
Я что-то упускаю или это "бета-ошибки" (я использую симуляторы из XCode6 GM seed, и у меня та же проблема на iPhone 5 с iOS 8 beta 5)?
Редактировать: выпуск iOS 8 и XCode 6.0.1, похоже, не решают проблему
4 ответа
Основываясь на ответе tubtub, я создал подкласс UITableViewHeaderFooterView:
@interface CompatibilityTableViewHeaderFooterView : UITableViewHeaderFooterView
@property (nonatomic,readonly) UILabel* compabilityTextLabel;
@end
@implementation CompatibilityTableViewHeaderFooterView
{
UILabel* iOS8TextLabel;
NSLayoutConstraint* iOS8TextLabelLeftMarginConstraint;
}
-(instancetype) initWithReuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithReuseIdentifier:reuseIdentifier])
{
self.contentView.backgroundColor = GRIS_213;
self.compabilityTextLabel.font = [UIFont boldSystemFontOfSize:15];
}
return self;
}
-(UILabel*) compabilityTextLabel
{
if ([UIDevice currentDevice].systemVersion.floatValue < 8.0)
{
return self.textLabel;
}
else
{
if (!iOS8TextLabel)
{
iOS8TextLabel = [[UILabel alloc] init];
iOS8TextLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:iOS8TextLabel];
iOS8TextLabelLeftMarginConstraint = [NSLayoutConstraint constraintWithItem:iOS8TextLabel attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1 constant:0];
[self addConstraint:iOS8TextLabelLeftMarginConstraint];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[iOS8TextLabel]-(>=0)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(iOS8TextLabel)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[iOS8TextLabel]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(iOS8TextLabel)]];
}
return iOS8TextLabel;
}
}
-(UITableView*) searchForTableView
{
UIView* currentView = self;
while (currentView)
{
currentView = currentView.superview;
if ([currentView isKindOfClass:[UITableView class]])
{
return (UITableView*)currentView;
}
}
return nil;
}
-(void) layoutSubviews
{
[super layoutSubviews];
UITableView* tableView = [self searchForTableView];
if (tableView)
{
iOS8TextLabelLeftMarginConstraint.constant = tableView.separatorInset.left;
}
}
Так что в основном я сейчас использую только compabilityTextLabel
собственность вместо textLabel
, Обратите внимание, что ограничение левого пространства автоматически обновляется, чтобы соответствовать вкладке разделителя tableView. Не стесняйтесь комментировать / улучшать мой код;)
[SWIFT версия] Просто была такая же проблема в UITableView UITableViewStylePlain, т.е. настройка шрифта заголовка в
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) {...}
не имеет никакого эффекта Вот код из моего подкласса UITableViewController
что сработало для меня [протестировано с XCode 6.4, iOS 8.4], см. http://www.elicere.com/mobile/swift-blog-2-uitableview-section-header-color/
override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
let header = view as? UITableViewHeaderFooterView //recast your view as a UITableViewHeaderFooterView
if (header == nil) {
return;
}
if (myHeaderFont != nil) {
header!.textLabel.font = myHeaderFont;
}
}
Высота жатки должна быть отрегулирована вручную:
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if (myHeaderFont == nil) {
return 20; //DEFAULT_HEADER_HEIGHT_IN_POINTS;
}
return myHeaderFont.pointSize * 2; //HEIGHT_REL_TO_FONT;
}
Остальное было стандартным, но для полноты показано здесь:
override func viewDidLoad() {
//...
//https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewHeaderFooterView_class/index.html#//apple_ref/doc/uid/TP40012241
self.tableView.registerClass(UITableViewHeaderFooterView.self, forHeaderFooterViewReuseIdentifier: "HEADER_REUSE_ID")
//...
}
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
var header = tableView.dequeueReusableHeaderFooterViewWithIdentifier("HEADER_REUSE_ID") as? UITableViewHeaderFooterView;
if (header == nil) {
header = UITableViewHeaderFooterView(reuseIdentifier: "HEADER_REUSE_ID");
}
header!.textLabel.text = myTitle;
return header!;
}
Вы можете изменить шрифт textLabel, переопределив метод -layoutSubviews:
- (void)layoutSubviews
{
self.textLabel.font = [UIFont boldSystemFontOfSize:15.0f];
self.textLabel.textAlignment = NSTextAlignmentCenter;
self.textLabel.textColor = [UIColor grayColor];
[super layoutSubviews];
}
У меня возникла та же проблема, и в результате я получил подкласс UITableViewHeaderFooterView.
Вот небольшая справочная реализация: просто установите header.headerLabel.text = @"myString";
,
@interface BHRSectionHeaderView : UITableViewHeaderFooterView
@property (nonatomic, strong) UILabel *headerLabel;
@end
@implementation BHRSectionHeaderView
- (UILabel *)headerLabel
{
if (!_headerLabel)
{
_headerLabel = [[UILabel alloc] initWithFrame:CGRectZero];
_headerLabel.font = [UIFont boldSystemFontOfSize:13.f];
_headerLabel.textColor = [UIColor redColor];
_headerLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:_headerLabel];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(16)-[header]-(>=0)-|"
options:0
metrics:nil
views:@{ @"header": _headerLabel }]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=0)-[header]-(>=0)-|"
options:0
metrics:nil
views:@{ @"header": _headerLabel }]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:_headerLabel
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterY
multiplier:1.0f
constant:0.0f]];
}
return _headerLabel;
}
@end