UIView анимация плохо себя ведет, когда iPad ориентация меняется - PullRequest
3 голосов
/ 20 октября 2010

Я использую этот код для эффекта перехода UIView

[UIView beginAnimations: nil context: nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
[UIView commitAnimations];

Теперь проблема заключается в том, что когда я поворачивал ipad в альбомной ориентации влево, он ведет себя странно, и если я даю условие, будет ли альбом слева, чем UIViewAnimationTransitionCurlDown, анимация по-прежнему не такая, как во время альбомной ориентации

Ответы [ 3 ]

2 голосов
/ 14 декабря 2010

У меня точно такая же проблема.Для людей, испытывающих затруднения в понимании проблемы:

Когда вы делаете «свернуться» в ландшафтном режиме, с кнопкой справа, страница начинает переворачиваться сверху вниз справа налево (то есть, вашперевернул страницу правой рукой и переместился к левой стороне книги. Это также означает, что переплет книги слева).

Когда вы делаете то же самое, но с кнопкой наслева анимация не вращается, даже при правильном вращении контента, говоря «shouldAutorotateToInterfaceOrientation: True» в vc.В результате анимация переходит от левого нижнего угла к верхнему правому, создавая впечатление, что переплет книги теперь находится справа.

Некоторый код, иллюстрирующий это:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self)
    {
        view1 = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
        [view1 setBackgroundColor:[UIColor greenColor]];
        [view1 setFont:[UIFont systemFontOfSize:80]];
        [view1 setText:@"VIEW 1"];

        view2 = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
        [view2 setBackgroundColor:[UIColor redColor]];
        [view2 setFont:[UIFont systemFontOfSize:80]];
        [view2 setText:@"VIEW 2"];
    }
    return self;
}


-(void)didSwipeNext
{
    [self performSelector:@selector(swipePrevious) withObject:nil afterDelay:1];
}

-(void)didSwipePrevious
{
    [self performSelector:@selector(swipeNext) withObject:nil afterDelay:1];
}

-(void)swipeNext
{
    [UIView beginAnimations:@"curl" context:NULL];
    [UIView setAnimationDuration:1];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationBeginsFromCurrentState:NO];
    [UIView setAnimationDidStopSelector:@selector(didSwipeNext)];

    [view1 removeFromSuperview];
    [self.view addSubview:view2];

    [UIView commitAnimations];
}

-(void)swipePrevious
{

    [UIView beginAnimations:@"curl" context:NULL];
    [UIView setAnimationDuration:1];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationBeginsFromCurrentState:NO];
    [UIView setAnimationDidStopSelector:@selector(didSwipePrevious)];

    [view2 removeFromSuperview];
    [self.view addSubview:view1];

    [UIView commitAnimations];
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:view1];
    [self performSelector:@selector(swipeNext) withObject:nil afterDelay:1];
}


// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}
1 голос
/ 28 ноября 2010

Вы пробовали использовать:

[UIView setAnimationBeginsFromCurrentState:NO];

Если вы запускаете анимацию во время изменения поворота, и для этого значения задано значение YES, оно может использовать кадр UIView при инвертировании координат.

Вы можете использовать методы willAnimateRotationToInterfaceOrientation и didAnimateRotationToInterfaceOrientation, чтобы остановить анимацию перед вращением и возобновить ее после.

0 голосов
/ 20 января 2012

Бен Джи четко объяснил проблему.Я нашел обходной путь, но не знал основную причину.Мой обходной путь здесь: UIViewAnimationOptionTransitionCurlUp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...