0

質問1:

UIView の正しいサイズを取得するにはどうすればよいですか?

タイル レイヤーを使用していくつかの画像を表示する CGRect を作成しています。CGRect を作成するときは、基本的に UIView とまったく同じサイズにする必要があります。これは非常に難しいことが判明しました.. NSLog() で mymainView.bounds.size.widthまたは mymainView.frame.size.widthをアウトすると、ランドスケープでは常に間違っています! 実際のビューがより広いことがわかりますが、常にポートレートであるかのように値をログアウトします。また、それらを逆にすることも間違っています。横向きの場合、幅を高さに設定するだけでは十分ではありません。適切な値が必要です。

正しく見えるようにする唯一の方法は、横向きの場合に手動で幅を 1024 に設定することですが、これも常に機能するとは限りません。

質問2:

デバイスが横向きかどうかを確認する正しい方法は何ですか?

使ってきました

if([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft || [UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeRight)

しかし、これは常に機能するとは限りません。起動時にデバイスを横向きモードにすると正しいですが、横向きにすると、ダッシュボードを横向きのままにしてiPadを平らに置き、起動すると、横向きのスプラッシュが表示されますが、そのコードは考えます縦長です。そのコードは、iPad シミュレーターでもまったく機能しません。

編集

何らかの理由で、横向きのサポートを追加することにしたとき、ターゲットの概要ページで横向きを確認するだけでは十分ではなく、TabBarController を実際にサブクラス化し、物理的に回転するように指示する必要がありました。と

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return YES;
}

私はこれをする必要はありません..そうですか?そのような空のプロジェクトを作成した場合、それは必要ありません..理由はわかりません。

4

2 に答える 2

1

私はこれに少し苦労しましたが、ここに私が見つけたいくつかの事実があります:

1- デバイスが上向きまたは下向きの場合、デバイスは上向きまたは下向きになる前の最後の向きに戻ります。これは、デバイスが縦向きか横向きかをこれら 2 つの向きだけで判断できるとは限らないためです。たとえば、横向きでデバイスを平らな面を上にして置いてアプリを起動すると、アプリは横向きで起動します。

2- viewDidLoad が呼び出されたとき、境界が設定されていないため、方向に関連する呼び出しを viewWillAppear または viewDidLayoutSubviews に配置する必要があります。

3- 何らかの奇妙な理由で、viewDidLoad の前に境界を使用する必要がある場合、またはモデルで何かを行う必要がある場合、方向に関連する設定を配置する最善の方法は、ステータスバーを信頼することであることがわかりました。たとえば、次のように呼び出します。

if(UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))

PS: 追加の質問については、 https ://developer.apple.com/library/ios/#qa/qa2010/qa1688.html を参照してください。

あなたはおそらく最後の 2 つの弾丸の 1 つです。以前にこの問題に遭遇しましたが、率直に言って、実装するのが最も簡単であることがわかりました。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;

すべての VC にとって、特に動作が iOS5 から iOS6 に変更されたことを安全に考えてください。

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/RespondingtoDeviceOrientationChanges/RespondingtoDeviceOrientationChanges.html#//apple_ref/doc/uid/TP40007457-CH7-SW1

お役に立てれば

于 2013-01-11T23:31:39.477 に答える
1

質問 1: はい、そうです。:)

質問 2: 家に帰って自分のコードを確認しました。私が使う:

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

現在のインターフェイスの向きを確認します。次に、次のようなものを使用できます。

if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
    // Do something
} else if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){
    // Do something else
}

ただし、回転イベントを適切に処理する場合は、これを行う必要はありません。

向きに基づいてコード内の UI 要素の位置を調整する必要がある場合に、回転を処理する一般的な方法を次に示します。

#pragma mark - View rotation methods

// Maintain pre-iOS 6 support:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

// Make sure that our subviews get moved on launch:
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    [self moveSubviewsToOrientation:orientation duration:0.0];
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

    [self moveSubviewsToOrientation:toInterfaceOrientation duration:duration];
}

// Animate the movements
- (void)moveSubviewsToOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration
{
    [UIView animateWithDuration:duration
                     animations:^{
                         [self.tableView reloadData];
                         if (UIInterfaceOrientationIsPortrait(orientation))
                         {
                             [self moveSubviewsToPortrait];
                         }
                         else
                         {
                             [self moveSubviewsToLandscape];
                         }
                     }
                     completion:NULL];
}

- (void)moveSubviewsToPortrait
{
    // Set the frames/etc for portrait presentation
    self.logoImageView.frame = CGRectMake(229.0, 21.0, 309.0, 55.0);
}

- (void)moveSubviewsToLandscape
{
    // Set the frames/etc for landscape presentation
    self.logoImageView.frame = CGRectMake(88.0, 21.0, 309.0, 55.0);
}

回転させるためにも入れmoveSubviewsToOrientationましたviewWillAppear

于 2013-01-11T23:21:22.967 に答える