I have my views showing in interface builder with my IB_DESIGNABLE
properties set, however when I use the preview feature to see how my views look on various devices, I just get the super view name, e.g. UIView
.
Don't IB_DESIGNABLE
views show in preview?
EDIT As requested code + screen shot:
H
=
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface TitleBannerView : UILabel
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
@property (nonatomic) IBInspectable CGFloat shadowHeight;
@end
M
=
@implementation TitleBannerView
@synthesize borderWidth;
@synthesize cornerRadius;
@synthesize shadowHeight;
- (void)drawRect:(CGRect)rect {
if (self.borderWidth == 0) self.borderWidth = 8.5;
if (self.cornerRadius == 0) self.cornerRadius = 33;
if (self.shadowHeight == 0) self.shadowHeight = 15.1;
CGContextRef context = UIGraphicsGetCurrentContext();
//// Color Declarations
UIColor* bG = [UIColor colorWithRed: 0.18 green: 0.8 blue: 0.443
alpha: 1];
UIColor* borderColor = [UIColor colorWithRed: 0.557 green: 0.267 blue: 0.678
alpha: 1];
UIColor* shadowColor2 = [UIColor colorWithRed: 0.976 green: 0.859 blue: 0.718
alpha: 1];
//// Shadow Declarations
UIColor* shadow = shadowColor2;
CGSize shadowOffset = CGSizeMake(-4.1, self.shadowHeight);
CGFloat shadowBlurRadius = 1.5;
//
//// Frames
CGRect frame = self.bounds;
//// Subframes
CGRect group = CGRectMake(CGRectGetMinX(frame) + 15,
CGRectGetMinY(frame) + 15, CGRectGetWidth(frame) - 28,
CGRectGetHeight(frame) - 40);
//// Abstracted Attributes
CGFloat roundedRectangleStrokeWidth = self.borderWidth ;
CGFloat roundedRectangleCornerRadius = self.cornerRadius;
//// Group
{
//// Rounded Rectangle Drawing
UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect:
CGRectMake(CGRectGetMinX(group) + floor(CGRectGetWidth(group) * 0.00060) + 0.5,
CGRectGetMinY(group) + floor(CGRectGetHeight(group) * 0.00568) + 0.5,
floor(CGRectGetWidth(group) * 0.99940) - floor(CGRectGetWidth(group) * 0.00060),
floor(CGRectGetHeight(group) * 0.99432) - floor(CGRectGetHeight(group) * 0.00568))
cornerRadius: roundedRectangleCornerRadius];
CGContextSaveGState(context);
CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius,
shadow.CGColor);
[bG setFill];
[roundedRectanglePath fill];
CGContextRestoreGState(context);
[borderColor setStroke];
roundedRectanglePath.lineWidth = roundedRectangleStrokeWidth;
[roundedRectanglePath stroke];
}
}
@end
The TitleBannerView is the view in green with purple border.
First, IBDesignable can be visible in preview.
Do you declare your IBDesignable class in a framework? IBInspectable ONLY supports preview when it's declared in a framework.
Also, keep in mind (not in your case):
Your draw code should be fast enough, you only have 100ms draw time for an item.
prepareForInterfaceBuilder() method is often needed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With