8

最新のSDKを使用してiOSアプリケーションを開発しています。

使用可能な一意の方向としてランドスケープの右方向を設定しましたが、viewControllerビューについて質問があります。

これは私のコードです:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(deviceOrientationDidChange:)
                                                 name:UIDeviceOrientationDidChangeNotification
                                               object:nil];
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != AVCaptureVideoOrientationLandscapeRight);
}

- (void)deviceOrientationDidChange:(NSNotification*)notification
{
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if (orientation == AVCaptureVideoOrientationLandscapeLeft)
        NSLog(@"Orientation: Landscape Left");
    else if (orientation == AVCaptureVideoOrientationLandscapeRight)
        NSLog(@"Orientation: Landscape Right");
    NSLog(@"FRAME: %@", NSStringFromCGRect(self.view.frame));
}

そして、これは私が取得するログです:

Orientation: Landscape Right
FRAME: {{0, 0}, {320, 568}}
Orientation: Landscape Right
FRAME: {{0, 0}, {320, 568}}

私の質問は:について{{0, 0}, {320, 568}}です

なぜこれらの値を取得するのですか?

正しい値は。だと思います{{0, 0}, {568, 320}}

4

4 に答える 4

3

フレームの長方形は向きの変化に反応しないと思います。

編集:私の元のソリューションは、あなたのニーズに対して非常に複雑でした。現在の向きを正しく見つけている場合は、横向きモードの場合は、長方形の幅を高さとして解釈します。

于 2013-03-19T16:37:38.020 に答える
1

このソリューションを追加して、フレームとバインドで何が起こるかを示します。

次の3つの方法を追加しました。

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
        CGRect bounds = [view bounds];
        NSLog(@"FRAME: %@", NSStringFromCGRect(view.frame));
        NSLog(@"BOUNDS: %@", NSStringFromCGRect(bounds));
}

- (void)deviceOrientationDidChange:(NSNotification*)notification
{
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if (orientation == AVCaptureVideoOrientationLandscapeLeft)
        NSLog(@"1. Orientation: Landscape Left");
    else if (orientation == AVCaptureVideoOrientationLandscapeRight)
        NSLog(@"1. Orientation: Landscape Right");
    NSLog(@"1. FRAME: %@", NSStringFromCGRect(self.view.frame));
    NSLog(@"1. BOUNDS: %@", NSStringFromCGRect(self.view.bounds));
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if (orientation == AVCaptureVideoOrientationLandscapeLeft)
        NSLog(@"2. Orientation: Landscape Left");
    else if (orientation == AVCaptureVideoOrientationLandscapeRight)
        NSLog(@"2. Orientation: Landscape Right");
    NSLog(@"2. FRAME: %@", NSStringFromCGRect(self.view.frame));
    NSLog(@"2. BOUNDS: %@", NSStringFromCGRect(self.view.bounds));
}

- (void)viewDidLayoutSubviews
{
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if (orientation == AVCaptureVideoOrientationLandscapeLeft)
        NSLog(@"3. Orientation: Landscape Left");
    else if (orientation == AVCaptureVideoOrientationLandscapeRight)
        NSLog(@"3. Orientation: Landscape Right");
    NSLog(@"3. FRAME: %@", NSStringFromCGRect(self.view.frame));
    NSLog(@"3. BOUNDS: %@", NSStringFromCGRect(self.view.bounds));
}

そして、これは私が得るものです:

FRAME: {{0, 0}, {320, 568}}
BOUNDS: {{0, 0}, {320, 568}}
3. Orientation: Landscape Right
3. FRAME: {{0, 0}, {320, 568}}
3. BOUNDS: {{0, 0}, {568, 320}}
1. Orientation: Landscape Right
1. FRAME: {{0, 0}, {320, 568}}
1. BOUNDS: {{0, 0}, {568, 320}}
1. Orientation: Landscape Right
1. FRAME: {{0, 0}, {320, 568}}
1. BOUNDS: {{0, 0}, {568, 320}}

のバインドされた変更viewDidLayoutSubviews:

于 2013-03-19T17:25:22.243 に答える
0

self.view.frameの代わりにself.view.boundsを使用する

于 2014-12-07T03:20:33.110 に答える
0

viewControllerの変更を変更してください

 SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];  

に置き換える

 SKScene * scene = [MyScene sceneWithSize:CGSizeMake(skView.frame.size.height, skView.frame.size.width)];
于 2015-07-31T10:50:39.880 に答える