2012-03-25 20 views
0

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

答えて

1

あなたはこれを少し考えて上かもしれ:)

私は同様の問題がありました。

- (void) updateBoundsWithRect:(CGRect)rect 
{ 
    _actionView.frame = rect; 
    self.view.frame = rect; 
} 

あなたが無料アプリをダウンロードして、コードの結果を参照してください。

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
{ 
    CGSize size = self.view.frame.size; 
    CGRect rect; 

    if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) 
    { 
     rect = CGRectMake(0, 0, size.height, size.width); 
    } 
    else 
    { 
     rect = CGRectMake(0, 0, size.width, size.height); 
    } 

    // Views that need updating   
    clockFaceView.frame = rect; 
    hourIndicatorView.frame = rect; 
    minuteIndicatorView.frame = rect; 
    // Update viewControllers 
    [timeInWordsOverlayController updateBoundsWithRect:rect]; 
    [actionOveralyViewController updateBoundsWithRect:rect]; 
} 

updateBoundsWithRectは次のように定義されています。これは私が問題を解決するために使用されるコードです。 iTunesリンク。 これが役立つことを願っています。

+0

さて、90度と180度の回転を区別する方法の問題を正確には扱っていないと思いますが、コードでは別の方法として、CGSizeプロパティを提案しています。新しい幅と高さは、キャッシュされたサイズと90度の回転だけ異なる場合があります。ポートレート対ランドスケープは、幅/高さ比によって決定することができる。しかし、私はブール値が簡単だと思います。 – Wienke

+0

@Wienke cool。どのようにしてこの問題を最終的に解決しますか? – haroldcampbell

+0

問題を解決するための主要な問題は、問題の2番目のコード例で回避策として解決されています。私が求めていた小さな問題は、その回避策がまったく必要である理由でした。情報は既にUIViewControllerによって保持されているので、直接アクセスすることができればうれしいです。 – Wienke