好吧,请记住,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 中配置为没有支柱或弹簧,这意味着所有边距都是灵活的,但宽度和高度不是。