UIView transitionFromView: toView: анимация не работает.
Это мой первый пост на stackru. Я новичок в 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
потому что я попытался добавить и удалить и получил сбой приложения в жесте повышения, точно на том же шаге, что не удается анимации. Возможно, это та же ошибка, но я не могу найти причину этого. Любая помощь будет оценена.
Благодарю.
Хорошо. С помощью Адриана, вот код 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 ответа
Узнайте больше об анимации в iOS.
В вашем примере вы забыли [UIView beginAnimations]
,
Во-первых, вы не можете смешать старый метод beginAnimation
commitAnimation
комбинация с новым блочным методом transitionFromView
,
Во-вторых, при использовании анимации блочного метода убедитесь, что вы используете контейнер (возможно, UIView), который будет родительским для двух представлений, которые вы хотите переключить. Без контейнера вы будете анимировать весь вид. Убедитесь, что контейнер имеет тот же размер, что и подпредставления, которые будут переключаться.
Пример:
[контейнер addSubView:frontView]; [контейнер addSubView: backView]; [self.view addSubView: container]; [UIView transitionFromView: backView toView: длительность frontView:0,5 опции:UIViewAnimationOptionTransitionFlipFromRight завершение: ноль];