私の目標は、ViewControllerでカスタムtextColor
サブクラスのUILabel
を設定することです。 UILabel
という名前のCircleLabel
サブクラスがあります。その基本は次のとおりです。
class CircleLabel: UILabel {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
}
override init(frame: CGRect) {
super.init(frame: frame)
}
override func drawRect(rect: CGRect) {
self.layer.cornerRadius = self.bounds.width/2
self.clipsToBounds = true
super.drawRect(rect)
}
override func drawTextInRect(rect: CGRect) {
self.textColor = UIColor.whiteColor()
super.drawTextInRect(rect)
}
func setProperties(borderWidth: Float, borderColor: UIColor) {
self.layer.borderWidth = CGFloat(borderWidth)
self.layer.borderColor = borderColor.CGColor
}
}
ご覧のとおり、インスタンス化するすべてのCircleLabelは、デフォルトでUIColor.whiteColor()のtextColorプロパティに設定されており、正しく機能します。ビューコントローラのviewDidLoadで、CircleLabelに動的なtextColor
プロパティを設定したいと思います。だからこのようなもの:
class myViewController: UIViewController {
@IBOutlet weak var myCustomLabel: CircleLabel!
override func viewDidLoad() {
super.viewDidLoad()
myCustomLabel.textColor = UIColor.blackColor()
}
textColor
がdrawRect
サブクラスのUILabel
メソッドに設定されているため、これは機能しません。ビューコントローラーでカスタムラベルのCircleLabel
を設定できるように、(setPropertiesヘルパーメソッドなどのヘルパーメソッドを介して)textColor
サブクラスに何を実装できますか?
スクリーンショット
この場合、drawRect
をオーバーライドする必要はありません。このように、クラスを作成するだけです。
class CircleLabel: UILabel {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
self.commonInit()
}
override init(frame: CGRect) {
super.init(frame: frame)
self.commonInit()
}
func commonInit(){
self.layer.cornerRadius = self.bounds.width/2
self.clipsToBounds = true
self.textColor = UIColor.whiteColor()
self.setProperties(1.0, borderColor:UIColor.blackColor())
}
func setProperties(borderWidth: Float, borderColor: UIColor) {
self.layer.borderWidth = CGFloat(borderWidth)
self.layer.borderColor = borderColor.CGColor
}
}
次に
class ViewController: UIViewController {
@IBOutlet weak var myCustomLabel: CircleLabel!
override func viewDidLoad() {
super.viewDidLoad()
myCustomLabel.textColor = UIColor.blackColor()
// Do any additional setup after loading the view, typically from a nib.
}
}
1。Swiftのカスタムラベル
class CustomLabel: UILabel {
@IBInspectable var topInset: CGFloat = 5.0
@IBInspectable var bottomInset: CGFloat = 5.0
@IBInspectable var leftInset: CGFloat = 7.0
@IBInspectable var rightInset: CGFloat = 7.0
override func drawText(in rect: CGRect) {
let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
super.drawText(in: rect.inset(by: insets))
}
override var intrinsicContentSize: CGSize {
let size = super.intrinsicContentSize
return CGSize(width: size.width + leftInset + rightInset,
height: size.height + topInset + bottomInset)
}
}