我知道這可能是一個老問題,現在看日期,但我最近面臨同樣的問題。您可能會偶然發現許多建議,例如轉換主視圖的子視圖或其圖層。非我的工作。
實際上,我發現的獨立解決方案是因爲您希望您的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);
}
}