我知道现在看来这可能是一个老问题,但我最近也遇到了同样的问题。您可能会偶然发现许多建议,例如转换主视图的子视图或其图层。这些都不适合我。
实际上,我发现的唯一解决方案是,由于您希望动态定位 UI 控件,因此不要主要在界面构建器中部署它们。界面构建器有助于了解纵向和横向动态控件的所需位置。即在界面生成器中创建两个单独的测试视图,一个纵向和另一个横向,根据需要对齐控件,并向下对齐 X、Y、宽度和高度数据,以便与每个控件的 CGRectMake 一起使用。
一旦您从界面构建器中写下所有需要的定位数据,就可以摆脱那些已经绘制的控件和出口/动作链接。他们现在不需要了。
当然不要忘记实现 UIViewController 的 willRotateToInterfaceOrientation 来设置控件的框架与每个方向的变化。
@interface
//Declare your UI control as a property of class.
@property (strong, nonatomic) UITableView *myTable;
@end
@implementation
// Synthesise it
@synthesize myTable
- (void)viewDidLoad
{
[super viewDidLoad];
// Check to init for current orientation, don't use [UIDevice currentDevice].orientation
if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft || self.interfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
myTable = [[UITableView alloc] initWithFrame:CGRectMake(20, 20, 228, 312)];
}
else if (self.interfaceOrientation == UIInterfaceOrientationPortrait)
{
myTable = [[UITableView alloc] initWithFrame:CGRectMake(78, 801, 307, 183)];
}
}
myTable.delegate = self;
myTable.dataSource = self;
[self.view addSubview:myTable];
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
{
// Show landscape
myTable.frame = CGRectMake(20, 20, 228, 312);
}
else
{
// Show portrait
myTable.frame = CGRectMake(78, 801, 307, 183);
}
}