2014-02-09 42 views
15

這裏改變字體大小的問題,故障與UITableViewHeaderFooterView

我子類UITableViewHeaderFooterView並要更改字體大小:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     self.textLabel.textColor = [UIColor colorWithWhite:0.8 alpha:1.0]; 
     //the font is not working 
     self.textLabel.font = [UIFont systemFontOfSize:20]; 
     NSLog(@"aaa%@", self.textLabel.font); 
    } 
    return self; 
} 

顏色的東西工作正常,但字體沒」 T改變,所以我日誌出隊:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    UITableViewHeader *headerView = [self.tableView dequeueReusableHeaderFooterViewWithIdentifier:MWDrawerHeaderReuseIdentifier]; 
    headerView.textLabel.text = self.sectionTitles[@(section)]; 
    NSLog(@"bbb%@", headerView.textLabel.font); 
    return headerView; 
} 

字體還行就在這裏,所以我登錄didLayoutsubviews

-(void)viewDidLayoutSubviews 
{ 
    UITableViewHeaderFooterView *head = [self.tableView headerViewForSection:0]; 
    NSLog(@"ccc%@", head.textLabel.font); 
} 

和字體大小奇蹟般地改變回默認!!!但是我之間沒有做任何事情,如果我在viewDidLayoutSubviews中再次更改字體大小,字體就變得正確了。

它驅使我瘋狂!

而且,我在子類化單元時做了相同的字體更改,並且它工作正常!所以誰能告訴我發生了什麼事?謝謝!

這裏是日誌:

2014-02-09 16:02:03.339 InternWell[33359:70b] aaa<UICTFont: 0x8da4290> font-family: ".HelveticaNeueInterface-M3"; font-weight: normal; font-style: normal; font-size: 20.00pt 

2014-02-09 16:02:03.339 InternWell[33359:70b] bbb<UICTFont: 0x8da4290> font-family: ".HelveticaNeueInterface-M3"; font-weight: normal; font-style: normal; font-size: 20.00pt 

2014-02-09 16:02:03.341 InternWell[33359:70b] aaa<UICTFont: 0x8da4290> font-family: ".HelveticaNeueInterface-M3"; font-weight: normal; font-style: normal; font-size: 20.00pt 

2014-02-09 16:02:03.342 InternWell[33359:70b] bbb<UICTFont: 0x8da4290> font-family: ".HelveticaNeueInterface-M3"; font-weight: normal; font-style: normal; font-size: 20.00pt 

2014-02-09 16:02:03.343 InternWell[33359:70b] ccc<UICTFont: 0x8d22650> font-family: ".HelveticaNeueInterface-MediumP4"; font-weight: bold; font-style: normal; font-size: 14.00pt 

2014-02-09 16:02:03.343 InternWell[33359:70b] ccc<UICTFont: 0x8d22650> font-family: ".HelveticaNeueInterface-MediumP4"; font-weight: bold; font-style: normal; font-size: 14.00pt 
+0

即使沒有子類化,也會出現同樣的問題UITableViewHeaderFooterView設置的字體在顯示視圖時被重置。檢查iOS 9.3。 – DevGansta

回答

8

似乎把它放在正確的地方它不會,但你可以在你的UITableViewHeaderFooterView子類的layoutSubviews方法更改字體,它會正確地應用。

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    // Font 
    self.textLabel.font = [UIFont systemFontOfSize:20]; 
} 
+4

'UITableViewHeaderFooterView'在'-layoutSubviews'中做調皮的事情,包括改變'textLabel'的顏色。如果它改變字體,我也不會感到驚訝。這也是我得到的解決方法,但它看起來像一個錯誤。 –

+2

必須有更好的方法來做到這一點 - 'layoutSubviews'應該只包含佈局,它可以在單個渲染循環中多次調用,因此,不建議在佈局之外放置其他任何東西;我認爲更好的方法是創建自定義標題標籤,或更新'willDisplayHeaderView'中的字體。 – Zorayr

15

您可以實現的tableView:willDisplayHeaderView和更改字體實物這樣:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section { 
    if(section == ...) 
    { 
     UITableViewHeaderFooterView *headerView = (UITableViewHeaderFooterView *)view; 
     NSAttributedString *headerText = ... ; 
     headerView.textLabel.attributedText = headerText; 
    } 
} 
+3

比選定的答案更好的解決方案。我只是在Swift中做到了,效果很好(並且不需要子類):\t覆蓋func tableView(tableView:UITableView,willDisplayHeaderView view:UIView,forSection section:Int){ \t \t if let header = view as? UITableViewHeaderFooterView { \t \t \t header.textLabel.font = UIFont.boldSystemFontOfSize(22.0) \t \t} \t} –

0

這是一個在斯威夫特一個解決方案 - 這裏的想法是,我們有一個UITableViewHeaderFooterView的子類別叫做SNStockPickerTableHeaderView;它公開了一種名爲configureTextLabel()的方法,該方法在調用時設置文本標籤的字體和顏色。我們只在標題被設置後調用這個方法,即從willDisplayHeaderView開始,並且字體被正確設置。

// MARK: UITableViewDelegate 

func tableView(tableView:UITableView, willDisplayHeaderView view:UIView, forSection section:Int) { 
    if let headerView:SNStockPickerTableHeaderView = view as? SNStockPickerTableHeaderView { 
    headerView.configureTextLabel() 
    } 
} 

func tableView(tableView:UITableView, viewForHeaderInSection section:Int) -> UIView? { 
    var headerView:SNStockPickerTableHeaderView? = tableView.dequeueReusableHeaderFooterViewWithIdentifier(kSNStockPickerTableHeaderViewReuseIdentifier) as? SNStockPickerTableHeaderView 
    if (headerView == nil) { 
    headerView = SNStockPickerTableHeaderView(backgroundColor:backgroundColor, 
     textColor:primaryTextColor, 
     lineSeparatorColor:primaryTextColor) 
    } 
    return headerView! 
} 

這裏是習俗UITableViewHeaderFooterView

import Foundation 
import UIKit 

private let kSNStockPickerTableHeaderViewLineSeparatorHeight:CGFloat = 0.5 
private let kSNStockPickerTableHeaderViewTitleFont = UIFont(name:"HelveticaNeue-Light", size:12) 

let kSNStockPickerTableHeaderViewReuseIdentifier:String = "stock_picker_table_view_header_reuse_identifier" 

class SNStockPickerTableHeaderView: UITableViewHeaderFooterView { 

    private var lineSeparatorView:UIView? 
    private var textColor:UIColor? 

    required init(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
    } 

    // We must implement this, since the designated init of the parent class 
    // calls this by default! 
    override init(frame:CGRect) { 
    super.init(frame:frame) 
    } 

    init(backgroundColor:UIColor, textColor:UIColor, lineSeparatorColor:UIColor) { 
    super.init(reuseIdentifier:kSNStockPickerTableHeaderViewReuseIdentifier) 
    contentView.backgroundColor = backgroundColor 
    self.textColor = textColor 
    addLineSeparator(textColor) 
    } 

    // MARK: Layout 

    override func layoutSubviews() { 
    super.layoutSubviews() 
    let lineSeparatorViewY = CGRectGetHeight(self.bounds) - kSNStockPickerTableHeaderViewLineSeparatorHeight 
    lineSeparatorView!.frame = CGRectMake(0, 
     lineSeparatorViewY, 
     CGRectGetWidth(self.bounds), 
     kSNStockPickerTableHeaderViewLineSeparatorHeight) 
    } 

    // MARK: Public API 

    func configureTextLabel() { 
    textLabel.textColor = textColor 
    textLabel.font = kSNStockPickerTableHeaderViewTitleFont 
    } 

    // MARK: Private 

    func addLineSeparator(lineSeparatorColor:UIColor) { 
    lineSeparatorView = UIView(frame:CGRectZero) 
    lineSeparatorView!.backgroundColor = lineSeparatorColor 
    contentView.addSubview(lineSeparatorView!) 
    } 
} 

下面是結果,請參見節頭, 「熱門股」:

                                                            enter image description here

0

好像textLabelfont甚至在IOS 11.

另一種解決方案(SWIFT 4)將被忽略是使用自定義標籤。如果您已有UITableViewHeaderFooterView子類,則不應該很困難。

class MyTableViewHeader: UITableViewHeaderFooterView { 
    let customLabel = UILabel() 

    override init(reuseIdentifier: String?) { 
     super.init(reuseIdentifier: reuseIdentifier) 
     setup() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setup() 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     customLabel.frame = contentView.bounds 
    } 

    func setup() { 
     customLabel.textColor = UIColor(white: 0.8, alpha: 1) 
     customLabel.font = UIFont.systemFont(ofSize: 20) 
     contentView.addSubview(customLabel) 
    } 
}