Подтвердить что ты не робот

IPhone Flip Animation с использованием UIViewAnimationTransitionFlipFromLeft в ландшафтном режиме

Я работаю над одним iPhone-приложением, в котором я реализовал одну анимацию UIViewAnimationTransitionFlipFromLeft. Здесь мое приложение отлично работает в режиме "Портрет". Он выполняет ту же анимацию, что и указанное, означает "Перевернуть слева направо".

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

Код, который я использую для приложения iPhone для поворота представления, выглядит следующим образом:

   CGContextRef context = UIGraphicsGetCurrentContext();
    [UIView beginAnimations:nil context:context];
    [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:self.view.window cache:NO];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:1.0];
    [UIView commitAnimations];
    [self.navigationController pushViewController:objSecond animated:YES];

Спасибо, С наилучшими пожеланиями, Гурприцхинг Саини

4b9b3361

Ответ 1

Если вы используете iOS 4.0 или новее, следующее будет делать именно то, что вы хотите (я просто проверил его, чтобы убедиться)

NewView *myNewView = [[NewView alloc] initWith.....];
[UIView transitionFromView:self.view toView:myNewView.view duration:1 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];
//[self.navigationController pushViewController:myNewView animated:NO];
[myNewView release];

EDIT: я немного меняю код (ничего нового, просто комментируя контроллер навигации, потому что это не обязательно для этого).

Таким образом, есть несколько способов сделать это (чтобы отслеживать следующее представление), но это самый легкий, о котором я могу думать. Вы уже можете переключиться с 1 на 2, поэтому я расскажу, как получить от 2 до 10 (или сколько вам нужно).

В принципе, переход к просмотру слишком длинный для viewDidLoad, чтобы поймать вызов, чтобы перейти к следующему представлению. Поэтому нам нужно настроить таймер, который ждет и отправит метод для переключения позднее. Таким образом, это код, который вы видите во взгляде 2 (и 3 и 4 и т.д.).

- (void)viewDidLoad {
    // this gets called before animation finishes, so wait;
    self.navigationController.delegate = self;
    // you will need to set the delegate so it can take control of the views to swap them;
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(switchView) userInfo:nil repeats:NO];
}

Я жду только 1 секунду, пока не вызову метод switch, но если вы много загружаете свои представления, вы можете подождать немного дольше. 1,5 секунды должно быть более чем достаточно, но вы можете поиграть с этим, чтобы увидеть, где он работает и не работает.

Затем вам нужно вызвать следующее представление в методе switchView.

- (void)switchView {
    NextView *myNextView = [[NextView alloc] initWith ... ];
    [UIView transitionFromView:self.view toView:nextView.view duration:1 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];
    [nextView release];
}

Это отлично сработало для меня. Чтобы удостовериться, что я получаю новые представления, я назначил метки для каждого представления и добавил UILabels как subviews в каждом представлении viewDidLoad, и каждый из них показывал номер его представления. Надеюсь, это то, что вам нужно. Я уверен, что у вас есть более сложные вещи, которые вам нужно будет сделать, но это даст вам анимацию и логику, которые вам нужны, чтобы получить нужный вам внешний вид. (на стороне примечание viewDidAppear, похоже, не вызывает вызов при выполнении этого, поэтому может потребоваться вызвать его вручную из viewDidLoad, если вам действительно нужно его использовать, но в противном случае он отлично работает)

Ответ 2

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

Обратите внимание, что аргумент контекста +beginAnimations:context: не должен быть CGContextRef как таковой. Вероятно, вы не хотите передавать текущий графический контекст. Пропустите NULL.

Ответ 3

CGContextRef context = UIGraphicsGetCurrentContext();

[UIView beginAnimations:nil context:context];

[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:self.view cache:NO];

[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[UIView setAnimationDuration:1.0];

[UIView commitAnimations];

Я думаю, что это сработает.

Ответ 4

Попробуйте следующее:

CABasicAnimation *rotateAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];
    CGFloat startValue = 0.0;
    CGFloat endValue = M_PI;
    rotateAnimation.fromValue = [NSNumber numberWithDouble:startValue];
    rotateAnimation.toValue = [NSNumber numberWithDouble:endValue];
    rotateAnimation.duration = 1.5;
    [self.view.layer addAnimation:rotateAnimation forKey:@"rotate"];

Ответ 5

Принятый ответ slev не сработал у меня, я получил всевозможные ошибки после попытки кода в моем пользовательском Segue. Я нашел метод, который работает не только, но и более точно, так как он не требует использования таймера. Вот MySegue.m:

@implementation FlipRightSegue

- (id)initWithIdentifier:(NSString *)iden source:(UIViewController *)sour destination:(UIViewController *)dest
{
    self = [super initWithIdentifier:iden source:sour destination:dest];

    return self;
}

- (void)perform
{

    UIViewController *src = [self sourceViewController];
    UIViewController *dst = [self destinationViewController];

    //[UIView transitionFromView:src.view toView:dst.view duration:1 options:UIViewAnimationOptionTransitionFlipFromRight completion:nil];
    //[UIView commitAnimations];

    [UIView transitionWithView:src.navigationController.view duration:0.8 options:UIViewAnimationOptionTransitionFlipFromLeft
                   animations:^{
                       [src.navigationController pushViewController:dst animated:NO];
                   }
                   completion:NULL];
}

@end

У меня также есть второй класс для переворачивания вправо. Код был взят с этого сайта: http://www.dailycode.info/Blog/post/2012/11/29/iOS-Custom-Flip-Segue-(portrait-and-landscape-layout)-xcode-4.aspx