问题
I'm trying to create & use a very simple UIView subclass for a rectangle with rounded corners. I've created a new class as follows :
RoundedRect.h
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@interface RoundedRect : UIView
@end
RoundedRect.m
#import "RoundedRect.h"
@implementation RoundedRect
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[[self layer] setCornerRadius:10.0f];
[[self layer] setMasksToBounds:YES];
}
return self;
}
@end
I'm using iOS 5.1 with storyboards and have set the custom class property in the IB inspector window to 'RoundedRect', but when I run the app the rectangle still has square corners. Have I missed something obvious?
Thanks Jonathan
回答1:
The initWithFrame
method is not called when the view is instantiated from a XIB file. Instead, the initWithCoder:
initializer is called, so you need to perform the same initialization in this method.
回答2:
In iOS 5 and up, there is absolutely no need to subclass - you can do it all from Interface Builder.
- Select the UIView you want to modify.
- Go to the Identity Inspector.
- In "User Defined & Runtime Attributes", add "layer.cornerRadius" in Key Path, Type should be "Number" and whatever setting you require.
- Also add 'layer.masksToBounds' as Boolean.
- Done! With no subclassing, and all in IB.
回答3:
The other guys have already answered the question but I would refactor it like this to enable use in nibs and in code
#import "RoundedRect.h"
@implementation RoundedRect
- (id)initWithFrame:(CGRect)frame;
{
self = [super initWithFrame:frame];
if (self) {
[self commonInit];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder;
{
self = [super initWithCoder:aDecoder];
if (self) {
[self commonInit];
}
return self;
}
- (void)commonInit;
{
CALayer *layer = self.layer;
layer.cornerRadius = 10.0f;
layer.masksToBounds = YES;
}
@end
回答4:
For views that are loaded from a NIB file, the designated initializer is initWithCoder:
. initWithFame:
is not called in this case.
回答5:
If UIView load from Nib, you should use method
- (void)awakeFromNib
来源:https://stackoverflow.com/questions/10190685/ios-create-uiview-subclass-for-rounded-rectangle