Is there a way for Interface Builder to render IBDesignable views which don't override drawRect:

前端 未结 8 606
不知归路
不知归路 2020-12-02 03:45

I very rarely override drawRect in my UIView subclasses, usually preferring to set layer.contents with pre-rendering images and often employing multiple sublaye

8条回答
  •  执念已碎
    2020-12-02 04:35

    This answer is related to overriding drawRect, but maybe it can give some ideas:

    I have a custom UIView class which has complex drawings in drawRect. You have to take care about references which are not available during design time, i.e. UIApplication. For that, I override prepareForInterfaceBuilder where I set a boolean flag which I use in drawRect to distinguish between runtime and design time:

    @IBDesignable class myView: UIView {
        // Flag for InterfaceBuilder
        var isInterfaceBuilder: Bool = false    
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            // Initialization code
        }
    
        required init(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    
        override func prepareForInterfaceBuilder() {
            self.isInterfaceBuilder = true
        }
    
        override func drawRect(rect: CGRect)
        {
            // rounded cornders
            self.layer.cornerRadius = 10
            self.layer.masksToBounds = true
    
            // your drawing stuff here
    
            if !self.isInterfaceBuilder {
                // code for runtime
                ...
            }
    
        }
    
    }
    

    An here is how it looks in InterfaceBuilder:

    enter image description here

提交回复
热议问题