縦向きと横向きに異なる xib ファイルを使用する必要があります。自動レイアウトは使用していませんが、iOS6 を使用しています。(理由が気になる場合は、前の質問を参照してください。)
amergin の initWithNib 名前のトリックで修正され、自分の iPhone/iPad のニーズに合わせて修正されたこの質問に対する Adam の回答に従っています。これが私のコードです:
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[[NSBundle mainBundle] loadNibNamed:[self xibNameForDeviceAndRotation:toInterfaceOrientation]
owner: self
options: nil];
[self viewDidLoad];
}
- (NSString *) xibNameForDeviceAndRotation:(UIInterfaceOrientation)toInterfaceOrientation
{
NSString *xibName ;
NSString *deviceName ;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
deviceName = @"iPad";
} else {
deviceName = @"iPhone";
}
if( UIInterfaceOrientationIsLandscape(toInterfaceOrientation) )
{
xibName = [NSString stringWithFormat:@"%@-Landscape", NSStringFromClass([self class])];
if([[NSBundle mainBundle] pathForResource:xibName ofType:@"nib"] != nil) {
return xibName;
} else {
xibName = [NSString stringWithFormat:@"%@_%@-Landscape", NSStringFromClass([self class]), deviceName];
if([[NSBundle mainBundle] pathForResource:xibName ofType:@"nib"] != nil) {
return xibName;
} else {
NSAssert(FALSE, @"Missing xib");
return nil;
}
}
} else {
xibName = [NSString stringWithFormat:@"%@", NSStringFromClass([self class])];
if([[NSBundle mainBundle] pathForResource:xibName ofType:@"nib"] != nil) {
return xibName;
} else {
xibName = [NSString stringWithFormat:@"%@_%@", NSStringFromClass([self class]), deviceName];
if([[NSBundle mainBundle] pathForResource:xibName ofType:@"nib"] != nil) {
return xibName;
} else {
NSAssert(FALSE, @"Missing xib");
return nil;
}
}
}
}
もちろん、私はやっています:
- (BOOL) shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
私のView Controllerと:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown);
}
私の代理人で。
関連する可能性のある2つの問題があります。まず、簡単なもの。逆さ回転はしません。iPadとiPhoneの両方で、xcodeですべての適切なビットをオンにしました。これは別の問題かもしれませんし、私の問題の核心かもしれません。
本当の問題は、横向きモードに回転すると、xib が置き換えられますが、ビューが 90 度ずれていることです。
これが私の2つのxibの外観です。(色が違うのが分かるように派手に塗ってます。)
と
そして、(最初はランドスケープ モードで) 実行すると、ランドスケープ xib が正しいことがわかります。
ポートレートに回転すると、それも正しいです
しかし、回転して横向きに戻すと、xib は置き換えられますが、ビューは 90 度ずれています。
ここで何が問題なのですか?