iPhoneを回転しているときにレイヤーを調整する必要があります。ただし、レイヤーを縦長から横長にまたはその逆に回転させる場合にのみ、レイヤーを調整する必要があります。 landscapeLeftを180度からlandscapeRightに、またはportraitを180度からportraitUpsideDownに変更すると、何もする必要はありません。UIViewControllerはどこからfromInterfaceOrientation情報を保持しますか?
ので、不必要な行動を避けるために、私は(self
は、ビューコントローラである)このようなテストを実行します。
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
BOOL bFromPortrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
BOOL bToPortrait = UIInterfaceOrientationIsPortrait(interfaceOrientation);
if (bFromPortrait != bToPortrait)
// make adjustments
}
、時間willAnimate
によって呼び出されるため、self.interfaceOrientation
がすでに持っていますbFromPortraitとbToPortraitは常に同じであり、調整は決して行われません。
willRotate
からこのコードを実行しようとしましたが、「interfaceOrientationプロパティにはまだビューの元の向きが含まれています。」しかし、その時点でレイヤーのホストビューの自動サイズ調整は行われていないため、ターゲットの向きに合わせて自動的にサイズ変更されたフレームにアクセスします。調整できないと、調整できません。
だから私はwillRotate
でそれを設定し、iPhoneから来た方向を追跡するために、ブール型プロパティbFromPortrait
を加え、willAnimate
でそれをアクセスし(これは動作します):
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
self.bFromPortrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
}
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
BOOL bToPortrait = UIInterfaceOrientationIsPortrait(toInterfaceOrientation);
if (self.bFromPortrait != bToPortrait)
// Make adjustments.
}
しかし、私は気づきましたdidRotateFromInterfaceOrientation
をオーバーフローさせた場合、そのfromInterfaceOrientation
argは、の後にと呼ばれていますが、iPhoneがどこから来ているのかを正しく反映しています。 余分なブール値のプロパティーbFromPortrait
は必要ないはずです。 UIViewControllerは既にこの情報を追跡していますが、どこで?どのように私はそれにアクセスするのですか?
didRotateFromInterfaceOrientation
で調整するのはなぜですか?問題は、アニメーションの後にこのメソッドが実行されるため、調整がスナップすることです。アニメーションに調整を含めるには、 willAnimate
)
さて、90度と180度の回転を区別する方法の問題を正確には扱っていないと思いますが、コードでは別の方法として、CGSizeプロパティを提案しています。新しい幅と高さは、キャッシュされたサイズと90度の回転だけ異なる場合があります。ポートレート対ランドスケープは、幅/高さ比によって決定することができる。しかし、私はブール値が簡単だと思います。 – Wienke
@Wienke cool。どのようにしてこの問題を最終的に解決しますか? – haroldcampbell
問題を解決するための主要な問題は、問題の2番目のコード例で回避策として解決されています。私が求めていた小さな問題は、その回避策がまったく必要である理由でした。情報は既にUIViewControllerによって保持されているので、直接アクセスすることができればうれしいです。 – Wienke