私は大きな問題を抱えています、そしてあなたがここで私を助けてくれることを本当に望んでいます...私は今非常に迷っています:(
MainWindow.xibで実行されるプロジェクトがあります。アプリのデリゲートファイルで、デバイスの向きを確認し、向きに基づいて異なるレイアウト(サブビュー)を持つ適切なNIBファイルを読み込みます。向きを確認するためのコードは次のとおりです。
-(void)checkTheOrientation
{
if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)
{
viewController = [[[MyViewController alloc] initWithNibName:@"MyWideViewController" bundle:nil] autorelease];
NSLog(@"Landscape = MyWideViewController");
}
else if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown)
{
viewController = [[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil] autorelease];
NSLog(@"Portrait = MyViewController");
}
}
これは期待どおりに機能し、横向きまたは縦向きで正しいビューを読み込んでいます。ポートレートビューは完全に読み込まれますが、ランドスケープビューは、xとyの位置がそれぞれ0と0に設定されていないかのように、左側に太い黒のエッジで読み込まれます。
これが縦向きのビューです: http: //uploads.socialcode.biz/2f25352B0e3x3z2t2z21 これがバグのある横向きのビューです:http://uploads.socialcode.biz/1G2k3T012d1z0Y1U2q1k
MyViewController.mファイルには、左側にあるこの大きな黒い帯を避けるために、サイズ設定を正しく行うための大まかな修正があります。このためのコードは次のとおりです。
- (void) performLayout {
// Ensure the main view is properly placed
NSInteger MaxSizeHeight, MaxSizeWidth;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
MaxSizeHeight = 1024;
MaxSizeWidth = 768;
}
if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) {
CGRect mainViewFrame = [[self view] frame];
float width = mainViewFrame.size.width;
mainViewFrame.size.width = mainViewFrame.size.height;
mainViewFrame.size.height = width;
mainViewFrame.origin.x = 0;
mainViewFrame.origin.y = 0;
[[self view] setFrame:mainViewFrame];
} else {
CGRect mainViewFrame = [[self view] frame];
mainViewFrame.origin.x = MaxSizeWidth - mainViewFrame.size.width;
mainViewFrame.origin.y = MaxSizeHeight - mainViewFrame.size.height;
[[self view] setFrame:mainViewFrame];
}
// Ensure the content view is properly placed
CGRect contentFrame = [mainContentView frame];
if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)
{
contentFrame.size.width = MaxSizeHeight;
contentFrame.size.height = MaxSizeWidth;
}
contentFrame.origin.x = 0;
contentFrame.origin.y = 44;
[mainContentView setFrame:contentFrame];
// Ensure the content subviews are properly placed
contentFrame.origin.y = 0;
for (UIView *contentView in [mainContentView subviews]) {
[contentView setFrame:contentFrame];
}
}
この方法の問題は、これが非常に悪いハックであり、実際には私の問題を解決していないことです。ランドスケープにロードすると、サブビューのサイズが変更されて1024x768,0,0に配置されますが、他のNIBを介してロードする追加のサブビューにも同じ問題があります。
私が本当に知りたいのは、これを一緒にハックしてperformLayoutセレクターを実行し続けることなく、ランドスケープのメインスーパービューを1024x768の位置0と0に設定する方法です。現時点では、ハックによってスーパービューのサイズが正しく設定されておらず、スーパービューの上にロードするサブビューだけが設定されているため、これには多くの矛盾があります。
このような簡単な修正でスーパービューの問題が解決するかもしれないと思いましたが、残念ながら解決しません。window.frame = CGRectMake(0、0、1024、768);
メインのスーパービューをロード時に正しく配置およびサイズ設定してから、スーパービューを適切な場所にロードするだけです。ここで私を助けてくれませんか?