私は本当にここに手を必要としています。XCode Interface Builder で正常に動作する UILabel の @IBDesignable サブクラスを作成しました。ただし、'clipsToBounds' を false に設定しても、Interface Builder は @IBInspectable プロパティの変更が機能している間、それをクリップします。
シミュレーターまたはデバイスでアプリを実行している場合、UILabel はクリップされず、目的の結果が得られます (Interface Builder の値を引き続き適用します)。
BEFORE THE CHANGE (サブビューが表示されます)
INTERFACE BUILDER の変更後 (サブビューは表示されません)
シミュレーターの変更後 (サブビューは期待どおりです)
どんな助けでも大歓迎です。カスタム クラスのコードは次のとおりです。
@IBDesignable class UIFeaturedLabel: UILabel {
@IBInspectable var borderWidth: Float = 4
@IBInspectable var borderOffsetX: Float = 15
@IBInspectable var borderOffsetY: Float = 5
@IBInspectable var borderColor: UIColor = UIColor.whiteColor()
private var headerView:UIView!
private var footerView:UIView!
override init() {
super.init()
createViews()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
createViews()
}
override init(frame: CGRect) {
super.init(frame: frame)
createViews()
}
func createViews() {
clipsToBounds = false
layer.masksToBounds = false
headerView = UIView()
footerView = UIView()
headerView.backgroundColor = UIColor.whiteColor()
footerView.backgroundColor = UIColor.whiteColor()
addSubview(headerView)
addSubview(footerView)
}
override func layoutSubviews() {
super.layoutSubviews()
let left = CGFloat( -borderOffsetX )
let right = CGFloat( frame.width + CGFloat(borderOffsetX*2) )
let top = CGFloat( -borderOffsetY )
let bottom = CGFloat( frame.height - CGFloat(borderWidth/2) ) + CGFloat( borderOffsetY )
headerView.frame = CGRectMake(left, top, right, CGFloat(borderWidth))
footerView.frame = CGRectMake(left, bottom, right, CGFloat(borderWidth))
}
}