Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interface Builder Clipping Designable Views

I really need a hand here. I have created an @IBDesignable subclass of UILabel which works fine in the XCode Interface Builder. However, even if I set 'clipsToBounds' to false, Interface Builder will still clip it whilst changing the @IBInspectable properties works.

If I'm running the app on simulator or device, the UILabel isn't clipped and gives me the desired results (whilst still applying the values that Interface Builder has).

BEFORE THE CHANGE (The subviews are visible) Before the change

AFTER THE CHANGE IN INTERFACE BUILDER (The subviews are out of view) After the change (builder)

AFTER THE CHANGE IN SIMULATOR (The subviews are as expected) After the change (simulator)

Any help would be massively appreciated. The code for the Custom Class is below.

@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))
}
}
like image 426
Joey Clover Avatar asked Oct 31 '22 13:10

Joey Clover


1 Answers

Still occurring with XCode 7.3 iOS9.3, but fixed in XCode Version 8.0 beta (8S128d).

like image 166
fruitcoder Avatar answered Nov 11 '22 19:11

fruitcoder