Nếu bạn ví dụ cần phải phân lớp UILabel
của bạn, sau đó thêm một số CALayer
trong đó bao gồm các văn bản, nó được khuyến khích để thêm CATextLayer
để CALayer
của bạn, đây là một ví dụ nhanh chóng:
@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)
}
}
Nguồn
2016-05-02 10:27:09
Là một sang một bên và ra khỏi tò mò về một thực hiện cụ thể mà tôi chấp nhận nó sẽ là một ý tưởng rất nghèo để dựa vào ngay cả khi biết; Tôi đã không kiểm tra nhưng có lẽ UILabel sử dụng một CATextLayer như sẵn có của nó trong iOS 3.2? – Tommy
@Tommy - 'UILabel' không được hỗ trợ bởi' CATextLayer' trước hoặc sau 3.2. Bạn có thể dễ dàng kiểm tra điều này với lớp "po [[someLabel layer]]" "sẽ tạo ra một' CALayer' cơ bản. Nó cũng khá rõ ràng vì 'CATextLayer' không có antialiasing phụ pixel nhưng' UILabel' làm. – PeyloW
Loại lớp không phải lúc nào cũng mang tính hướng dẫn, vì bất kỳ ai đã từng thử [str isKindOfClass: [NSMutableString class]] đều có thể chứng thực. Đó là một vấn đề cầu nối và rõ ràng là CALayer không phải là chính thức miễn phí cầu nối với bất cứ điều gì, nhưng để giả định không có lớp học tương tự clustering hoặc aliasing trong CALayer chỉ là: một giả định. Tôi lấy ý kiến của bạn rằng đầu mối antialiasing phụ pixel là khá dứt khoát mặc dù. – Tommy