ios - ¿Cómo aplico las propiedades de UIAppearance Proxy a UILabel?
(4)
De acuerdo, resulta que no puede aplicar estilo a ninguna propiedad de UILabel utilizando el proxy UIAppearance
.
Mientras que la clase UILabel
ajusta al protocolo UIAppearanceContainer
, una comprobación de UILabel.h muestra que ninguna de sus propiedades está marcada con UI_APPEARANCE_SELECTOR
, el requisito previo para el uso de UIAppearance
.
Tío.
He estado obteniendo resultados poco confiables al intentar aplicar estilos de proxy UIAppearance al proxy de clase UILabel. Por ejemplo, el siguiente funciona como era de esperar:
[[UILabel appearance] setFont:[UIFont fontWithName:SOME_FONT size:SOME_SIZE]];
[[UILabel appearance] setShadowColor:[UIColor blackColor]];
Sin embargo, configurar el textColor no funciona, esto:
[[UILabel appearance] setColor:[UIColor greenColor]];
funciona. Tipo de Es poco confiable y hace que cualquier llamada específica de instancia a setTextColor:
sea ignorada.
¿Cuál es la forma correcta de aplicar estilos de UIAppearance a UILabel?
El siguiente código funcionó para mí usando swift 2.2 y para 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`
En Swift, usted hace lo siguiente para personalizar los atributos de apariencia para un UILabel cuando está contenido en un UITableViewHeaderFooterView:
UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 18)
UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).textColor = .white
Esto se aplicará al atributo textLabel cuando use UITableViewHeaderFooterView en:
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
}
Esto realmente ayuda al usar UITableViewStyle.grouped, ya que esas vistas de encabezado de sección parecen anularse con un estilo predeterminado incluso si personaliza la UITableViewHeaderFooterView.textLabel en viewForHeaderInSection
He subclase UILabel
@interface SmallLabel : UILabel
@end
@implementation SmallLabel
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
}
return self;
}
@end
Luego uso appearanceWhenContainedIn:
UIFont *smallFont = [UIFont fontWithName:@"Arial" size:15];
[[SmallLabel appearanceWhenContainedIn:[UIView class], nil] setFont:smallFont];
Esto funciona para usar la fuente deseada para todos los SmallLabels en mi aplicación. Solo necesito configurar la clase personalizada en SmallLabel en el inspector de identidad XCode. No parece funcionar con etiquetas creadas mediante programación, solo aquellas en NIB.
Después de más pruebas, este método no siempre funciona de manera confiable.