Я знаю, что этот вопрос задавался раньше, но ответы противоречат друг другу, и я запутался, поэтому, пожалуйста, не раздражайте меня.
Я хочу иметь многократно используемый UIView
подкласс во всем моем приложении. Я хочу описать интерфейс с помощью файла пера.
Теперь предположим, что это представление индикатора загрузки с индикатором активности в нем. Я хотел бы на каком-то событии создать экземпляр этого представления и анимировать его в представлении контроллера представления. Я мог бы без проблем описать интерфейс представления программно, создавая элементы программно и задавая их фрейм внутри метода инициализации и т. Д.
Как я могу сделать это с помощью пера? Сохранение размера, указанного в построителе интерфейса, без необходимости устанавливать фрейм.
Мне удалось это сделать вот так, но я уверен, что это неправильно (это просто представление с пикером в нем):
- (id)initWithDataSource:(NSDictionary *)dataSource {
self = [super init];
if (self){
self = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", [self class]] owner:self options:nil] objectAtIndex:0];
self.pickerViewData = dataSource;
[self configurePickerView];
}
return self;
}
Но я перезаписываю себя, и когда я его создаю:
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
Мне нужно вручную установить рамку, а не забирать ее из IB.
РЕДАКТИРОВАТЬ: я хочу создать это настраиваемое представление в контроллере представления и иметь доступ для управления элементами представления. Мне не нужен новый контроллер представления.
Спасибо
РЕДАКТИРОВАТЬ: Я не знаю, является ли это лучшей практикой, я уверен, что это не так, но я сделал это так:
FSASelectView *selectView = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@",[FSASelectView class]] owner:self options:nil] objectAtIndex:0];
selectView.delegate = self;
[selectView configurePickerViewWithData:ds];
selectView.frame = CGRectMake(0, self.view.bottom + 50, selectView.width, selectView.height);
selectView.alpha = 0.9;
[self.view addSubview:selectView];
[UIView animateWithDuration: 0.25 delay: 0 options:UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveEaseInOut animations:^{
selectView.frame = CGRectMake(0, self.view.bottom - selectView.height, selectView.width, selectView.height);
selectView.alpha = 1;
} completion:^(BOOL finished) {
}];
Правильная практика все еще нужна
Должно ли это быть сделано с помощью контроллера представления и инициализации с именем пера? Должен ли я установить перо в каком-либо методе инициализации UIView в коде? Или то, что я сделал, нормально?
initWithDataSource
? В любом случае это будет работать, даже если вы укажете для владельца значение «Nil».