如何将UIAppearance代理属性应用于UILabel?

时间:2012-08-07 03:58:25

标签: ios uilabel uiappearance

尝试将UIAppearance代理样式应用于UILabel类代理时,我得到的结果不可靠。例如,以下工作正如我所料:

[[UILabel appearance] setFont:[UIFont fontWithName:SOME_FONT size:SOME_SIZE]];
[[UILabel appearance] setShadowColor:[UIColor blackColor]];

设置textColor不起作用,但是:

[[UILabel appearance] setColor:[UIColor greenColor]];

确实有效。 。它有点不可靠,导致忽略setTextColor:的任何特定于实例的调用。

将UIAppearance样式应用于UILabel的正确方法是什么?

4 个答案:

答案 0 :(得分:53)

好的,事实证明你无法使用UIAppearance代理设置任何UILabel属性

虽然UILabel类符合UIAppearanceContainer协议,但对UILabel.h的检查显示其属性均未标记为UI_APPEARANCE_SELECTOR,这是使用{UIAppearance的先决条件。 1}}。

开溜。

答案 1 :(得分:1)

我已经将UILabel

分类
@interface SmallLabel : UILabel

@end

@implementation SmallLabel

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
    }
    return self;
}

@end

然后我使用appearanceWhenContainedIn:

UIFont *smallFont = [UIFont fontWithName:@"Arial" size:15];
[[SmallLabel appearanceWhenContainedIn:[UIView class], nil] setFont:smallFont];

这适用于我的应用中所有SmallLabel的所需字体。我只需要在XCode Identity Inspector中将Custom Class设置为SmallLabel。它似乎不适用于以编程方式创建的标签,仅适用于NIB中的标签。

进一步测试后,此方法并不总是可靠地运行。

答案 2 :(得分:1)

在Swift中,您可以在UITableViewHeaderFooterView中包含自定义UILabel的外观属性:

UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 18)
UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).textColor = .white

当您在以下位置使用UITableViewHeaderFooterView时,这将适用于textLabel属性:

 public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    var headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: headerViewId)
    if headerView == nil {
        headerView = UITableViewHeaderFooterView(reuseIdentifier: headerViewId)
    }
    headerView?.textLabel?.text = "My Header".uppercased()
    return headerView
}

这在使用UITableViewStyle.grouped时非常有用,因为即使您在viewForHeaderInSection中自定义UITableViewHeaderFooterView.textLabel,这些节头视图似乎也会被默认样式覆盖

答案 3 :(得分:0)

以下代码使用swift 2.2和iOS 9.0为我工作

    let textFieldInsideSearchBar = self.searchBar?.valueForKey("searchField") as? UITextField
    textFieldInsideSearchBar?.textColor = BCGConstants.Colors.darkBluishPurpleColor()

    let textFieldInsideSearchBarLabel = textFieldInsideSearchBar!.valueForKey("placeholderLabel") as? UILabel
    textFieldInsideSearchBarLabel?.textColor = UIColor(red: 220/255, green: 209/255, blue: 231/255, alpha: 1.0)`enter code here`