1

これについてはすでにいくつかの質問がありますが、満足のいく答えはありません。可能な限り単純な例を使用して、フレームと境界が間違っているように見える理由を正確に知りたいです。誰かがそれを処理する適切な方法を教えてくれます...

ストーリーボードなしでシングル ビュー アプリケーションを作成し、ランドスケープのみのサポートにチェックを入れます。次に、didFinishLaunching メソッドで:


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    ViewController *vc = [[ViewController alloc] init];
    self.window.rootViewController = vc;
    [self.window makeKeyAndVisible];

    return YES;
}

そしてView Controllerで:


- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor redColor];
}

- (void)viewDidAppear:(BOOL)animated
{
    NSLog(@"%.1f,%.1f",self.view.frame.size.width,self.view.frame.size.height);
}

次に、出力は 768.0,1024.0 です。これは、横長のサイズの画面が赤色でいっぱいになっているにもかかわらず、明らかに間違っています。そのため、サブビューの配置やサイズ変更を self.view.frame または self.view.bounds に頼ることはできません。

このような問題を回避する最新の「適切な」方法は何ですか? (ペン先やストーリーボードを使用せず、幅と高さをハッキリと交換しません)

4

2 に答える 2

0

これが正しいかどうかはわかりませんが、私の最善の推測であり、現時点ではテストできません。私が間違っていなければ、デフォルトの向きはどのアプリケーションでも縦です。したがって、さまざまな方向をサポートするには、アプリケーションで自動回転メソッドを実装する必要があります (ビルドしている iOS のバージョンによって少し異なります)。したがって、アプリケーションが横向きモードのみをサポートするようにチェックされていても、実際には回転しません。指定されたメソッドを実装してみて、どうなるか教えてください...

iOS 5 以前の場合は、次を使用する必要があります。

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
return YES;
}

return NO;
}

iOS 6 以降では、次を使用する必要があります。

-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}

-(BOOL)shouldAutorotate
{
return YES;
}

回転後にビューのフレームを確認すると、問題ないはずです。

編集:

このSOの質問とその回答を見てください。彼らはいくつかの素晴らしい回避策を提供します。また、アプリケーションではほとんどの場合、ビュー コントローラーがナビゲーション コントローラーまたはタブ バー コントローラー、あるいはその両方に埋め込まれていることを考えると、それらをサブクラス化/作成して、すべてが確実にビュー コントローラーに転送されるようにすることができます。

別の素晴らしい答えは、実際に何が起こっているかを説明しています。

于 2013-10-04T10:48:32.530 に答える
0

フレームと境界のサイズをチェックするのが早すぎます。

代わりに、回転後にそれらを確認してください。

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    NSLog(@"Bounds %@", NSStringFromCGRect(self.view.bounds));
    NSLog(@"Frame %@", NSStringFromCGRect(self.view.frame));
}
于 2013-10-04T10:48:58.817 に答える