Хорошо, имейте в виду, что IBOutlet - это просто свойство, которое было объявлено таким образом, чтобы сделать его видимым в IB.Итак, ответ на ваш первый вопрос - да.При необходимости вы всегда можете переназначить это свойство в коде.
Я предполагаю, что у вас уже есть два IBOutlet для ваших пейзажных и портретных видов - что-то вроде этого:
@property (nonatomic, retain) IBOutlet UIView *landscapeView;
@property (nonatomic, retain) IBOutlet UIView *portraitView;
И это звучит так, как выВы выбираете соответствующий вид в willAnimateRotationToInterfaceOrientation:duration:
.
Аналогичным образом, вы можете объявить два выхода для ваших видов сборщика:
@property (nonatomic, retain) IBOutlet UIPickerView *landscapePickerView;
@property (nonatomic, retain) IBOutlet UIPickerView *portraitPickerView;
Если вы пойдете по этому маршруту, я бы объявил динамическое свойствоэто всегда возвращает представление выбора для текущей ориентации.
@property (nonatomic, retain, readonly) UIPickerView *pickerView;
Вместо того, чтобы синтезировать это свойство, вы можете реализовать его следующим образом:
- (UIPickerView *) pickerView {
if (self.landscapeView.superview) {
return self.landscapePickerView;
}
else {
return self.portraitPickerView;
}
}
Однако, если у вас более одногоили два подпредставления, с такими параллельными свойствами, как этот беспорядок в вашем контроллере, может стать проблемой.В этом случае я бы подумал о создании пользовательского подкласса UIView, называемого чем-то вроде PickerContainer, который имеет выходы для вашего pickerView и любых других подпредставлений, к которым вам нужен доступ.Затем в IB вы можете изменить классы вашего альбомного и портретного видов на PickerContainer, и вы можете подключить каждый сборщик напрямую к его суперпредставлению.Затем в вашем контроллере вы можете просто создать одно динамическое свойство, подобное этому:
@property (nonatomic, retain, readonly) PickerContainer *pickerContainer;
- (PickerContainer *)pickerContainer {
return (PickerContainer *)self.view;
}
, и после этого вы можете получить доступ к вашему pickerView для текущей ориентации через его контейнер, например:
[self.pickerContainer.pickerView reloadAllComponents];
РЕДАКТИРОВАТЬ: Вот как я реализовал willAnimateRotationToInterfaceOrientation:duration:
в одном из моих проектов:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
if (UIInterfaceOrientationIsPortrait(interfaceOrientation)) {
if (self.landscapeView.superview) [self.landscapeView removeFromSuperview];
self.portraitView.center = CGPointMake(self.view.bounds.size.width / 2,
self.view.bounds.size.height / 2);
[self.view addSubview:self.portraitView];
}
else {
if (self.portraitView.superview) [self.portraitView removeFromSuperview];
self.landscapeView.center = CGPointMake(self.view.bounds.size.width / 2,
self.view.bounds.size.height / 2);
[self.view addSubview:self.landscapeView];
}
}
Мой альбомный и портретный виды были настроены без распорок или пружин в IB, что означает, что все поля являются гибкими, ноширина и высота не.