One (or two) of the coolest new features in recent Xcode releases are the IBInspectable
properties and IBDesignable
UIView
s. These have nothing to do with the functionality of your application but instead impact the developer experience in Xcode. The goal is to be able to visually inspect custom views in your iOS application without running it. So assume that you have a custom view creatively named CustomView
that inherits from UIView
. In this custom view, it will display a string of text with a designated color. You can also choose not to display any text. We'll need three properties:
var textColor: UIColor = UIColor.blackColor()
var text: String?
var showText: Bool = true
We can then override the drawRect
function in the class:
if showText {
if let text = text {
let s = NSString(string: text)
s.drawInRect(rect,
withAttributes: [
NSForegroundColorAttributeName: textColor,
NSFontAttributeName: UIFont(name: "Helvetica Neue", size: 18)!
])
}
}
Assuming that the text
property is set, this will draw a string in the upper left hand corner of the view when the application is run. The problem is we won't know what it looks like without running the application. This is where IBInspectable
and IBDesignable
come in. IBInspectable
allows us to visually set property values of the view in Xcode, just like with the built in controls. IBDesignable
will show us a visual preview in the storyboard. Here is how the class should look:
@IBDesignable
class CustomView: UIView {
@IBInspectable var textColor: UIColor = UIColor.blackColor()
@IBInspectable var text: String?
@IBInspectable var showText: Bool = true
override func drawRect(rect: CGRect) {
// ...
}
}
Or in Objective C:
IB_DESIGNABLE
@interface CustomView: UIView
@property (nonatomic, strong) IBInspectable UIColor* textColor;
@property (nonatomic, strong) IBInspectable NSString* text;
@property (nonatomic, assign) IBInspectable BOOL showText;
@end
@implementation CustomView
- (instancetype)init {
if(self = [super init]) {
self.textColor = [UIColor blackColor];
self.showText = YES;
}
return self;
}
- (void)drawRect:(CGRect)rect {
//...
}
@end
The next screenshots show what happens in Xcode. The first one is what happens after adding the revised class. Notice that there are three new UI elements for the three properties. The Text Color will display a color picker, Text is just an input box and Show Text will give us the options for Off
and On
which are false
and true
respectively.
The next is after changing the Text Color to red using the color picker. Also, some text has been provided to make the drawRect
function display it. Notice that the view in Interface Builder has been updated as well.
Finally, setting Show Text to Off
in the property inspector makes the text display in Interface Builder disappear.
However, We all come up situation when we need to create rounded UIView
at multiple views in your Storyboard
.Instead of declaring IBDesignable
to every views of Storyboard
, its better to create an Extension
of UIView
and get a user interface built just for your every UIView
through out the project to create rounded view by setting corner radius.A configurable border radius on any UIView you create in storyboard.
extension UIView {
@IBInspectable var cornerRadius:CGFloat {
set {
layer.cornerRadius = newValue
clipsToBounds = newValue > 0
}
get {
return layer.cornerRadius
}
}
}