Существует ли зарегистрированный способ установить ориентацию iPhone?

Format-Table не имеет ничего общего с тем, что я просто попробую сделать следующее в PowerSell V 4.0 и PowerShel V5.0, и проблема может быть воспроизведена:

Get-Process |Select-Object -Property name ; pause

арка поворота:

Get-Process |Select-Object -Property Name  |%{Write-host $_.name};pause

Здесь снова выполняется пауза:

Get-Process |%{$_.name | Set-Content 'c:\temp\test.txt';$_} |Select-Object -Property Name  ;pause

Но не здесь

Get-Process |%{$_.name | Set-Content 'c:\temp\test.txt';Start-Sleep -Milliseconds 1;$_} |Select-Object
-Property Name  ;pause

Для меня в PowerShell V5.0 все работает, как если бы хост не нужен в инструкциях, которые конвейерны, тогда эти инструкции запускаются асинхронно.

Мне бы хотелось, чтобы люди, как @Keith Hill, смотрели на это поведение.

94
задан The Archetypal Paul 10 November 2008 в 07:45
поделиться

7 ответов

Это больше не проблема в более поздней версии iPhone 3.1.2 SDK. Теперь он, кажется, соблюдает запрошенную ориентацию представления, возвращаемого в стек. Это, вероятно, означает, что вам нужно будет обнаруживать более старые версии iPhone OS и применять setOrientation только тогда, когда он предшествует последнему выпуску.

Неясно, поймет ли статический анализ Apple, что вы работаете с ограничениями старых SDK. Мне лично Apple посоветовал удалить вызов метода при следующем обновлении, поэтому я еще не уверен, пройдет ли процесс утверждения взлома для старых устройств.

6
ответ дан 24 November 2019 в 06:07
поделиться

Это - то, что я использую. (Вы получаете некоторые предупреждения компиляции, но это работает и в Средстве моделирования и в iPhone)

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
-3
ответ дан kdbdallas 5 November 2019 в 13:17
поделиться

Я не думаю, что это возможно сделать во времени выполнения, хотя Вы могли, конечно, просто применить преобразование на 90 градусов к своему UI.

-3
ответ дан Andrew Grant 5 November 2019 в 13:17
поделиться

При использовании UIViewControllers существует этот метод:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

Возврат NO для контроллеров представления, содержащих представления, Вы не хотите вращаться.

[еще 112] информация здесь

-3
ответ дан Martin Gordon 5 November 2019 в 13:17
поделиться

Из того, что я могу сказать, setOrientation:, метод не работает (или возможно не работает больше). Вот то, что я делаю, чтобы сделать это:

первый, помещает, это определяет наверху Вашего файла, прямо под Вашим #imports:

#define degreesToRadian(x) (M_PI * (x) / 180.0)

тогда, в viewWillAppear: метод

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];     
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {  
    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}

, если Вы хотите, чтобы это было анимировано, тогда можно обернуть все это в блок анимации, как так:

[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:1.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];     
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {  
    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}
[UIView commitAnimations];

Затем в Вашем контроллере режима портрета, можно сделать реверс - проверка, чтобы видеть, если в настоящее время в среде, и если так, поверните его назад к Портрету.

16
ответ дан Venk 5 November 2019 в 13:17
поделиться

Если вы хотите заставить его поворачиваться из портретной в ландшафтную форму, вот код. Просто отметьте, что вам нужно отрегулировать центр вашего обзора. Я заметил, что мой не поместил вид в правильном месте. В остальном все работало отлично. Спасибо за подсказку.

if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){

        [UIView beginAnimations:@"View Flip" context:nil];
        [UIView setAnimationDuration:0.5f];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
        self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
        self.view.center = CGPointMake(160.0f, 240.0f);

        [UIView commitAnimations];
}
16
ответ дан 24 November 2019 в 06:07
поделиться

У меня была проблема, когда у меня был UIViewController на экране, в UINavigationController, в альбомной ориентации. Однако когда следующий контроллер представления вставляется в поток, мне нужно, чтобы устройство вернулось в книжную ориентацию.

Я заметил, что метод shouldAutorotateToInterfaceOrientation: не вызывается, когда новый контроллер представления помещается в стек, но он вызывается, когда контроллер представления выгружается из стека.

Пользуясь этим, я использую этот фрагмент кода в одном из своих приложений:

- (void)selectHostingAtIndex:(int)hostingIndex {

    self.transitioning = YES;

    UIViewController *garbageController = [[[UIViewController alloc] init] autorelease];
    [self.navigationController pushViewController:garbageController animated:NO];
    [self.navigationController popViewControllerAnimated:NO];

    BBHostingController *hostingController = [[BBHostingController alloc] init];
    hostingController.hosting = [self.hostings objectAtIndex:hostingIndex];
    [self.navigationController pushViewController:hostingController animated:YES];
    [hostingController release];

    self.transitioning = NO;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    if (self.transitioning)
        return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
    else
        return YES;
}

В принципе, создавая пустой контроллер представления, заталкивая его в стек и тут же сбрасывая, можно заставить интерфейс вернуться в портретное положение. После того, как контроллер был вытолкнут, я просто нажимаю на контроллер, который я намеревался вытолкнуть в первую очередь. Визуально это выглядит великолепно - пустой произвольный контроллер представления никогда не виден пользователю.

7
ответ дан 24 November 2019 в 06:07
поделиться