Как перехватить ротацию iPhone - PullRequest
0 голосов
/ 14 марта 2012

в моем приложении я получил дом с несколькими кнопками.Каждая кнопка открывает отдельный вид.В каждом представлении, если я помещаю устройство в альбомную ориентацию, отображается представление справки.Все работает хорошо, за исключением того, что в каком бы виде я не находился, если я ставлю iPhone, как лежать на столе (я не знаю, как лучше объяснить) ... приложение выходит из этого представления и возвращается к первому виду,дом.Вот мой код:

- (void)viewDidLoad
{
[super viewDidLoad];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(orientationChanged:)name:@"UIDeviceOrientationDidChangeNotification" 
object:nil];
[self performSelector:@selector (ritardo) withObject:nil afterDelay:5.0f];
}

-(void)orientationChanged:(NSNotification *)object{
UIDeviceOrientation deviceOrientation = [[object object] orientation];

if (deviceOrientation == UIInterfaceOrientationPortrait)
{
    [UIView beginAnimations:@"View Flip" context:nil];
    [UIView setAnimationDuration:0.5f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    self.view = self.portraitView;
}
else  if (deviceOrientation == UIInterfaceOrientationLandscapeLeft || deviceOrientation 
== UIInterfaceOrientationLandscapeRight)
{
    [UIView beginAnimations:@"View Flip" context:nil];
    [UIView setAnimationDuration:0.5f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    self.view = self.landscapeView;
}
[UIView commitAnimations];
[self dismissModalViewControllerAnimated:NO];
}

-(void) ritardo {
ruota.image = [UIImage imageNamed:@"RuotaPerAiuto.png"];    
}

- (void)viewDidUnload
{
[self setPortraitView:nil]; 
[self setLandscapeView:nil];
[self setRuota:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation: 
(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
} else {
    return YES;
}
}
@end

Привет, надеюсь, вы мне поможете

РЕДАКТИРОВАТЬ: Я изменил объект - (void) directionChanged: (NSNotification *) {таким образом:

-(void)orientationChanged:(NSNotification *)object{
UIDeviceOrientation deviceOrientation = [[object object] orientation];
if (deviceOrientation == UIDeviceOrientationFaceUp)// || deviceOrientation == 
UIDeviceOrientationFaceDown) 
{
    return;
}
if (deviceOrientation == UIInterfaceOrientationPortrait || deviceOrientation == 
UIInterfaceOrientationPortraitUpsideDown)
{
    [UIView beginAnimations:@"View Flip" context:nil];
    [UIView setAnimationDuration:0.5f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    self.view = self.portraitView;
}
else 
if (deviceOrientation == UIInterfaceOrientationLandscapeLeft || deviceOrientation == 
UIInterfaceOrientationLandscapeRight)
{
    [UIView beginAnimations:@"View Flip" context:nil];
    [UIView setAnimationDuration:0.5f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    self.view = self.landscapeView;
}
[UIView commitAnimations];
[self dismissModalViewControllerAnimated:NO];
}

Теперь, если я нахожусь в портретном положении и получаю iPhone лицом к лицу, положение работает хорошо.Но когда я меняю положение с лица на портрет, он возвращается к дому ...

1 Ответ

1 голос
/ 14 марта 2012

Проблема в том, что UIDeviceOrientationDidChangeNotification будет запущен независимо от shouldAutorotateToInterfaceOrientation. И вы не обрабатываете случаи UIInterfaceOrientationPortraitUpsideDown, UIDeviceOrientationFaceUp и UIDeviceOrientationFaceDown в методе orientationChanged:. Поэтому, когда устройство поворачивается в одну из этих ориентаций, ваш код эквивалентен:

-(void)orientationChanged:(NSNotification *)object
{
    [UIView commitAnimations];
    [self dismissModalViewControllerAnimated:NO];
}

Итак, вы должны удалить строки:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:)name:@"UIDeviceOrientationDidChangeNotification" object:nil];

и введите код в методе willRotateToInterfaceOrientation:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    [UIView beginAnimations:@"View Flip" context:nil];
    [UIView setAnimationDuration:0.5f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    if (UIInterfaceOrientationIsPortrait(interfaceOrientation)) {
        self.view = self.portraitView;
    } else {
        self.view = self.landscapeView;
    }
    [UIView commitAnimations];
    [self dismissModalViewControllerAnimated:NO];
}

Редактировать

Если вы хотите оставить orientationChanged, измените его следующим образом:

-(void)orientationChanged:(NSNotification *)object{
    UIDeviceOrientation deviceOrientation = [[object object] orientation];
    if (deviceOrientation == UIInterfaceOrientationPortrait) {
        [UIView beginAnimations:@"View Flip" context:nil];
        [UIView setAnimationDuration:0.5f];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
        self.view = self.portraitView;
        [UIView commitAnimations];
        [self dismissModalViewControllerAnimated:NO];
    } else  if (deviceOrientation == UIInterfaceOrientationLandscapeLeft || deviceOrientation == UIInterfaceOrientationLandscapeRight) {
        [UIView beginAnimations:@"View Flip" context:nil];
        [UIView setAnimationDuration:0.5f];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
        self.view = self.landscapeView;
        [UIView commitAnimations];
        [self dismissModalViewControllerAnimated:NO];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...