Я создал подкласс UIView, связанный с файлом .xib. Этот подкласс UIView должен использоваться в UIViewController. В контроллере, я думаю, есть два варианта создания экземпляра подкласса UIView:
MyUIView *myView=[[MyUIView alloc] initWithFrame:aRect];
а также
MyUIView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyUIView"
owner:self
options:nil] lastObject];
Я предпочитаю первый подход или его варианты, которые позволяют выполнять пользовательскую инициализацию. Единственная проблема в том, что мне нужно указать прямоугольник фрейма, который уже был указан в .xib
(я имею в виду высоту и ширину фрейма MyUIView
). Да, я могу снова жестко закодировать его в aRect
, но это утомительно поддерживать (например, когда я меняю положение пользовательских интерфейсов в .xib, мне также нужно обновить aRect
).
Таким образом, второй подход должен прийти на ум, поскольку прямоугольник кадра устанавливается автоматически. Оставшаяся проблема заключается в том, что я не могу настроить инициализатор (скажем, я хочу передать дополнительные параметры во время инициализации).
Каковы ваши предпочтения? Какой из них лучше на ваш взгляд?
EDIT1: Вдохновленный ответом Серджио, я придумал этот обходной путь:
// In MyViewController.m
MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectMake(x, y, 0.0, 0.0)];
// In MyView.m
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView"
owner:self
options:nil] lastObject];
[self setFrame:CGRectMake(frame.origin.x,
frame.origin.y,
[self frame].size.width,
[self frame].size.height)];
// frame's width and height already determined after
// loadNibNamed was called
...
}
return self;
}