UIView transitionFromView: toView: анимация не работает. - PullRequest
6 голосов
/ 26 февраля 2012

Это мой первый пост на stackoverflow. Я новичок в iOS-разработке и не являюсь носителем английского языка, поэтому постараюсь объяснить свою проблему.

Проблема:

Я добавил два вида в окно AppDelegate и хочу переключаться с одного на другое, используя:

 UIView transitionFromView:toView:

Первый вид (MainScreenView) имеет собственный ViewController. В .xib-файле MainScreenView у меня есть кнопка с действием, вызывающим метод goShow, реализованный в моем AppDelegate. В этом методе я использую UIView transitionFromView:toView: для перехода ко второму виду. Пока все работает нормально. Мое второе представление (представление прокрутки) объявлено программно в моем AppDelegate и содержит кучу изображений внутри (picturesViewController), а поверх них - UIPinchGestureRecognizer.

Я использую распознаватель жестов, чтобы вернуться к моему MainScreenView. Вот где проблема. Когда я делаю жест щипка на просмотре прокрутки, MainScreenView.view появляется сразу перед анимацией, поэтому анимация при переворачивании выглядит неправильно.

Код, который я использую:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

mainScreen = [[MainScreenViewController alloc] initWithNibName:@"MainScreenViewController" bundle: [NSBundle mainBundle]];

CGRect frame = self.window.bounds;
int pageCount = 10;
scrollView = [[UIScrollView alloc] initWithFrame:frame];
scrollView.contentSize = CGSizeMake(320*pageCount, 480);
scrollView.pagingEnabled = YES;
scrollView.showsHorizontalScrollIndicator = FALSE;
scrollView.showsVerticalScrollIndicator = FALSE;
scrollView.delegate = self;

[...] 'While' adding pictures to de scrollView

UIPinchGestureRecognizer *twoFingerPinch = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(goBackToMain)] autorelease];
[scrollView addGestureRecognizer:twoFingerPinch];

[self.window addSubview: scrollView];
[scrollView setHidden:TRUE];
[self.window addSubview: mainScreen.view];

[self.window makeKeyAndVisible];
return YES;
}

-(void) goShow{

[UIView transitionFromView:mainScreen.view
                    toView:scrollView 
                  duration:0.5
                   options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews                    
                completion:NULL];

[UIView commitAnimations];    
}

-(void) goBackToMain {

[UIView transitionFromView:scrollView
                    toView:mainScreen.view 
                  duration:0.5
                   options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews                     
                completion:NULL]; 

[UIView commitAnimations];
}

Я использую представления «показать / скрыть» вместо addSubview/removeFromSuperView, потому что я попытался добавить и удалить и получил сбой приложения в жесте «щепотка», точно на том же шаге, который завершается с ошибкой анимации. Возможно, это та же ошибка, но я не могу найти причину этого. Любая помощь будет оценена.

Спасибо.

Ok. С помощью Адриана, вот код UIPinchGesture, который решил мою проблему:

[...]

UIPinchGestureRecognizer *twoFingerPinch = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(goBackToMain:)] autorelease];
[scrollView addGestureRecognizer:twoFingerPinch];


-(void)goBackToMain:(UIPinchGestureRecognizer *)recognizer {

if (recognizer.state == UIGestureRecognizerStateEnded)
{
    [UIView transitionFromView:scrollView
                        toView:mainScreen.view 
                      duration:0.4
                       options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews                     
                    completion:nil]; 

    [UIView commitAnimations];
}

Ответы [ 2 ]

1 голос
/ 11 октября 2013

Во-первых, вы не можете смешать комбинацию старого метода beginAnimation commitAnimation с новым методом блока transitionFromView.

Во-вторых, при использовании анимации блочного метода убедитесь, что вы используете контейнер (возможно, UIView), который будет родительским для двух представлений, которые вы хотите переключить. Без контейнера вы будете анимировать весь вид. Убедитесь, что контейнер имеет тот же размер, что и подпредставления, которые будут переключаться.

Пример:


    [container addSubView:frontView];
    [container addSubView:backView];

    [self.view addSubView:container];

    [UIView transitionFromView:backView toView:frontView duration:0.5 options:UIViewAnimationOptionTransitionFlipFromRight completion:nil];

0 голосов
/ 26 февраля 2012

Подробнее об анимации в iOS .

В вашем примере вы забыли [UIView beginAnimations].

...