5

私は本当にここに手を必要としています。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))
}
}
4

1 に答える 1

2

XCode 7.3 iOS9.3 でも発生しますが、XCode バージョン 8.0 ベータ版 (8S128d) で修正されています。

于 2016-06-16T11:57:39.563 に答える