loadNibNamed против.Дилемма initWithFrame для установки высоты и ширины фрейма
-
13-12-2019 - |
Вопрос
Я создал подкласс 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
, слишком).
Поэтому следует принять во внимание второй подход, поскольку прямоугольник кадра устанавливается автоматически.Оставшаяся проблема заключается в том, что я не могу настроить инициализатор (скажем, я хочу передать дополнительные параметры во время инициализации).
Каковы ваши предпочтения?Какой из них лучше на ваш взгляд?
РЕДАКТИРОВАТЬ1:Вдохновленный ответом Серджио, я придумал обходной путь:
// 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;
}
Решение
Пробовали ли вы использовать:
MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectZero];
Я не знаю, работает ли это в вашем случае (загрузка представления из пера), но я успешно использую его, когда программно создаю свое собственное представление.
Вы можете попробовать.
РЕДАКТИРОВАТЬ:
ты можешь определить свой собственный init
метод для вашего просмотра:
-(id)initWithPosition:(CGPoint)pos;
а затем позвоните:
-(id)initWithPosition:(CGPoint)pos {
if (self = [super initWithFrame:{pos,{0,0}}]) {
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
}