2012-01-11 4 views
0

私は、ユーザーが自分のiPhoneを縦向きと横向きに動かしたかどうかに応じて、ボタンのレイアウトを変更するアプリを作っています。私は自分のコードを配置するのに最適な場所はiphone向きを検出する最良の方法

-(BOOL) shouldautorotatetointerfaceorientation 

になりますと思った。しかし、少なくとも3回呼ばれるページがshouldautorotatetointerfaceorientationにロードされる

  1. との2つの大きな問題があります。コードを一度しか実行しません。

  2. モーダルsegueでviewController1(page1)からviewController2(page2)に移動しても、私のviewcontroller1にあるautorateコードを呼び出しているページ2に私のiPhoneを回転させます。それは非常に奇妙です。

とにかく私のオリエンテーションベースのアイコンを置くのに最適な場所は何ですか?

答えて

5

方法

-(BOOL) shouldautorotatetointerfaceorientation 

の唯一の目的は、サポートされている方向を決定することです。

あなたがローテーションにカスタムアクションを行いたい場合、あなたは、1つまたはメソッド

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration 
+0

...またはあなたがそのメソッド内に置く任意のコードは(該当する場合)もアニメーション化されますので、しばしば非常に有用である 'willAnimateRotationToInterfaceOrientation'、など非常に簡単に現在の向きを取得します。 – lxt

+0

私はちょうどこれを知って、実用的に私は[[NSNotificationCenter defaultCenter] addObserver:self セレクタを追加する必要があります:@セレクタ(didRotate :) 名前:@ "UIDeviceOrientationDidChangeNotification"オブジェクト:なし]; didRotate関数とdidRotateと一緒にユーザーがデバイスをポートレートモードまたはランドスケープモードで移動したかどうかを確認します。 –

+0

@SamBudda上記のメソッドのデフォルトを登録する必要はありません。しかし、デバイスの向きの変更に対してトリガされるカスタムメソッド 'didRotate'が必要な場合は、あなたが言及した通知を追加する必要があります。 – PengOne

0

UIDevice.orientation;

の両方を実装したいしかし、あなたはまだ正しくから通知を実装する必要がありますユーザの回転。コードを複数回不必要に実行しないようにするには、最後の方向が何であるかを覚えておいて、コードが変更された場合にのみ実行します。

+2

デバイスの向きは、インターフェイスの向きと同じではないことに注意してください。 – PengOne

+0

@PengOne良い点! –

1

UIViewのサブクラスを作成し、-(void)layoutSubviewsを上書きする必要があります。このメッセージは、オリエンテーションを変更するか、setNeedsToDisplayと設定すると呼び出されます。あなたはあなたのサブビューのポジションを変化させるアニメーションを得るでしょう。
[[UIApplication sharedApplication] statusBarOrientation]

関連する問題