メソッドに次のコードがあります。シミュレーターでこれを実行すると、デバッガーはコードをスキップしますか?何が足りないのですか?
if (([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft) ||
([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight))
{
} else {
}
アップデート2
これは問題ではありませんが、向きの通知をオンにしてみてください。
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(detectOrientation) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
更新
私の悪い、私はそれが空だと思った。
Orステートメントを削除して、単一の方向をテストしてみてください。それで問題が解決するかどうかを確認してください。多分ブラケットの問題か何かばかげている。
私は本番コードで次のテストを行っているので、あなたのテクニックはうまくいくはずです:
if (([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft) ||
([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight)) {
}
元の回答
ステップインするには、実際にifブロックにステートメントを配置する必要があります。
デバッガーは、空のブロックをスキップするのに十分スマートです。
インターフェイスの向きを判断する最良の方法は、ステータスバーの向きを確認することです。
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
if(orientation == UIInterfaceOrientationPortrait ||
orientation == UIInterfaceOrientationPortraitUpsideDown) {
//Portrait orientation
}
if(orientation == UIInterfaceOrientationLandscapeRight ||
orientation == UIInterfaceOrientationLandscapeLeft) {
//Landscape orientation
}
UIDevice
クラスは、加速度計に基づいて向きを測定します。デバイスが平らになっていると、正しい向きを返しません。
マクロUIDeviceOrientationIsLandscape
とUIDeviceOrientationIsPortrait
があるので、LandscapeLeftとLandscapeRightと別々に比較する代わりに、次のようにすることができます。
if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
{
}
オリエンテーション通知をオンにせずにこれを行う別の方法は、
ステップ1:現在の方向をローカル変数myCurrentOrientation
に保存し、次のように割り当てます。
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
{
myCurrentOrientation = toInterfaceOrientation;
}
ステップ2:チェックにmyCurrentOrientation
を使用します
if (UIInterfaceOrientationIsLandscape(myCurrentOrientation) == YES) {
// landscape
}
else {
// portrait.
}
いくつかの行のコードを安全にするために、あなたの代わりに私の強調表示されたコードを使用することをお勧めします。
-(void) viewDidLoad
{
[super viewDidLoad];
[self rotations];
}
-(void)rotations
{
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
}
-(void) orientationChanged:(NSNotification *)notification
{
//USE THIS PART
//USE THIS PART
//USE THIS PART
//USE THIS PART
//USE THIS PART
if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation))
{
}
}
の代わりに
if([[UIDevice currentDevice] orientation] == UIInterfaceOrientationPortrait ||
[[UIDevice currentDevice] orientation] == UIInterfaceOrientationPortraitUpsideDown)
{
}
画面の向きと真の中心を見つける方法は次のとおりです。 UIActivityIndicatorViewを適切に設定できるように、Tuszyのメソッドを使用しました。
- (BOOL) isPortraitOrientation {
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
if(orientation == UIInterfaceOrientationPortrait ||
orientation == UIInterfaceOrientationPortraitUpsideDown) {
return true;
}
if(orientation == UIInterfaceOrientationLandscapeRight ||
orientation == UIInterfaceOrientationLandscapeLeft) {
return false;
}
return false;
}
そして、中心を得る方法...
- (void) findMyUIViewCenter {
CGPoint myCenter;
if ([self isPortraitOrientation]) {
myCenter = self.view.center;
}
else {
myCenter = CGPointMake(self.view.frame.size.height / 2.0, self.view.frame.size.width / 2.0);
}
NSLog(@"true center -- x:%f y:%f )",myCenter.x,myCenter.y);
}
値を取得する前に、[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]
を呼び出す必要があります。このメソッドのドキュメントをご覧ください。これを追跡するのにしばらく時間がかかりました。
Springboard Tweak内にいて、現在のアプリの向きに応じて何かを表示したい場合は、これを使用できます(脱獄のみ)。
UIInterfaceOrientation o = [[UIApplication sharedApplication] _frontMostAppOrientation];