Ответ 1
Метод initWithFrame
не вызывается, когда представление создается из файла XIB. Вместо этого вызывается инициализатор initWithCoder:
, поэтому вам нужно выполнить ту же инициализацию в этом методе.
Я пытаюсь создать и использовать очень простой подкласс UIView для прямоугольника с закругленными углами. Я создал новый класс следующим образом:
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
Я использую iOS 5.1 с раскадными версиями и установил свойство пользовательского класса в окне инспектора IB на "RoundedRect", но когда я запускаю приложение, прямоугольник все еще имеет квадратные углы. Я пропустил что-то очевидное?
Спасибо Джонатан
Метод initWithFrame
не вызывается, когда представление создается из файла XIB. Вместо этого вызывается инициализатор initWithCoder:
, поэтому вам нужно выполнить ту же инициализацию в этом методе.
В iOS 5 и выше нет необходимости в подклассе - вы можете сделать все это из Interface Builder.
Другие ребята уже ответили на вопрос, но я бы реорганизовал его так, чтобы включить использование в nibs и в коде
#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
Для представлений, загружаемых из файла NIB, назначенный инициализатор initWithCoder:
. initWithFame:
в этом случае не вызывается.
Если загрузка UIView из Nib, вы должны использовать метод
- (void)awakeFromNib