Si, por ejemplo, necesita subclase su UILabel
, a continuación, añadir un poco de CALayer
que cubre el texto, se recomienda añadir CATextLayer
a su CALayer
, aquí es un ejemplo rápido:
@IBDesignable class BWRoundedLabel: UILabel {
override var text: String? {
didSet {
updateView()
}
}
@IBInspectable override var shadowColor: UIColor? {
didSet {
updateView()
}
}
private func updateView() {
let width = bounds.size.width - 1
let height = bounds.size.height - 1
let shadowLayer = CAShapeLayer()
shadowLayer.path = UIBezierPath(roundedRect: CGRectMake(0, 0, width, height), cornerRadius: width/2).CGPath
shadowLayer.fillColor = UIColor.yellowOrange().CGColor
shadowLayer.shadowColor = shadowColor?.CGColor
shadowLayer.shadowPath = shadowLayer.path
shadowLayer.shadowOffset = CGSize(width: 0, height: 1.0)
shadowLayer.shadowOpacity = 1
shadowLayer.shadowRadius = 0
let textLayer = CATextLayer()
textLayer.foregroundColor = UIColor.whiteColor().CGColor
textLayer.string = text
textLayer.fontSize = font.pointSize
textLayer.font = "Calibri-Bold"
textLayer.alignmentMode = kCAAlignmentCenter
textLayer.frame = CGRectMake(0, (height - 16)/2, width, 16)
if let sublayers = layer.sublayers {
for sublayer in sublayers {
sublayer.removeFromSuperlayer()
}
}
layer.insertSublayer(shadowLayer, atIndex: 0)
layer.insertSublayer(textLayer, atIndex: 1)
}
}
Como Dejando de lado y por curiosidad acerca de una implementación específica que acepto, sería una idea muy pobre en la que confiar incluso si se conociera; No lo he comprobado, pero presumiblemente UILabel usa un CATextLayer a partir de su disponibilidad en iOS 3.2. – Tommy
@Tommy - 'UILabel' no está respaldado por un' CATextLayer' antes o después de 3.2. Puede inspeccionar fácilmente esto con "' po [[someLabel layer] class] '" que producirá un 'CALayer' básico. También es bastante visualmente evidente ya que 'CATextLayer' no tiene un antialiasing sub-píxel, pero' UILabel' sí. – PeyloW
El tipo de clase no siempre es instructivo, como cualquiera que haya probado alguna vez [str isKindOfClass: [NSMutableString class]] puede dar fe. Esa es una cuestión de puente y, obviamente, CALayer no tiene ningún puente de conexión oficialmente con nada, pero suponer que no hay agrupamiento de clase similar o aliasing dentro de CALayer es solo eso: una suposición. Considero que la pista antialias sub-pixel es bastante definitiva. – Tommy