如何将UIAppearance Proxy属性应用于UILabel?

在尝试将UIAppearance代理样式应用于UILabel类代理时,我一直得到不可靠的结果。 例如,下面的工作,我期望:

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

设置textColor不起作用,但是,这:

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

确实有效 那种 。 这是有点不可靠的,并导致任何特定于实例的调用setTextColor:被忽略。

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

好吧,事实certificate,您不能使用UIAppearance代理devise任何UILabel属性

虽然UILabel类符合UIAppearanceContainer协议,但对UILabel.h的检查显示,它的任何属性都没有标记UI_APPEARANCE_SELECTOR ,这是使用UI_APPEARANCE_SELECTOR的先决条件。

开溜。

我已经分类了UILabel

 @interface SmallLabel : UILabel @end @implementation SmallLabel - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { } return self; } @end 

那么我使用外观当包含在:

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

这适用于我的应用程序中的所有SmallLabels所需的字体。 我只需要在XCode Identity Inspector中将Custom Class设置为SmallLabel。 它似乎没有与标签创build编程,只有那些在NIBs。

进一步testing后,这种方法并不总是可靠地工作。

以下代码使用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` 

在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,那些部分标题视图似乎被默认样式覆盖