UIViewController не реагирует на прикосновения после CATransform3D Animation

Мой UIViewController в стиле «библиотеки» выполняет анимацию поворота CATransform3D с углом 1,75 радиана, чтобы скрыть ее перед нажатием (без анимации) на следующий или последний вид. К сожалению, при выполнении анимации при извлечении UIViewController всплывающий VC не будет реагировать на касания.

Вещи, которые я пробовал: -

  • Чтобы анимация отображалась после всплывания, а не чтобы она вообще не анимировалась, я должен задержать ее на 0,1 секунды. Для этого я использую NSObject PerformSelector:withObject:afterDelay. К сожалению, это, при идеальном выполнении анимации, вызывает проблему с моим именем.
  • Чтобы использовать NSTimer для выполнения действия через 0,1 секунды и без повторения. Это ничего не делает.
  • Использовать функцию задержки UIView во время анимации, а это означает, что анимация не выполняется.
  • Чтобы использовать селектор для выполнения анимации, на который ссылается другой. Безрезультатно.
  • Чтобы вызвать touchesEnded, пока представление не реагировало на касания, без какого-либо эффекта.

Мой текущий код, хотя и немного неопрятный (мое первое использование Core Animation/QuartzCore), это...

Чтобы выполнить анимацию, если выскочил.

//To collect it in the SecondVC
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(coolAnimation) name:@"ReturnSecond" object:nil];
//To send it from the ThirdVC
[[NSNotificationCenter defaultCenter] postNotificationName:@"ReturnSecond" object:nil];

Чтобы поп VC

[[NSNotificationCenter defaultCenter] postNotificationName:@"ReturnWeird" object:nil];
NSUInteger integer = [[self.navigationController viewControllers] indexOfObject:self];
[[self navigationController] popToViewController:[[self.navigationController viewControllers] objectAtIndex:integer-1] animated:NO];

Чтобы представить анимацию

- (void)coolAnimation
{
    [self performSelector:@selector(tryThis) withObject:nil afterDelay:0.1];
}

- (void)tryThis
{
    CGRect framer = self.view.layer.frame;
    self.view.layer.anchorPoint = CGPointMake(0.f, 0.f);
    self.view.layer.frame = framer;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.3];
    CATransform3D rotationAndPerspectiveTransforms = CATransform3DIdentity;
    rotationAndPerspectiveTransforms.m34 = 1.0 / 500;
    rotationAndPerspectiveTransforms = CATransform3DRotate(rotationAndPerspectiveTransforms, 0, 0, 1, 0);
    self.view.layer.transform = rotationAndPerspectiveTransforms;
    [UIView commitAnimations];

    CGRect framers = flippedCell.layer.frame;
    flippedCell.layer.anchorPoint = CGPointMake(0.f, 0.f);
    flippedCell.layer.frame = framers;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.7];
    CATransform3D rotateTransform = CATransform3DIdentity;
    rotateTransform.m34 = 1.0 / 500;
    rotateTransform = CATransform3DRotate(rotateTransform, 0, 0, 1, 0);
    flippedCell.layer.transform = rotateTransform;
    [UIView commitAnimations];

    [self performSelector:@selector(cellAnimationDidStop) withObject:nil afterDelay:0.7];
}

- (void)cellAnimationDidStop
{
    [self.tableView reloadData];
}

Вид поворачивается на 1,75 радиана перед нажатием и поэтому будет сохраняться под этим углом преобразования до тех пор, пока не будет повернут обратно.

Любые советы для моего кода также будут оценены!


person Giz    schedule 18.12.2012    source источник
comment
отступ делает код намного легче для чтения. Чем легче читать код, тем больше людей будет хотеть вам помочь.   -  person Jonathan.    schedule 19.12.2012


Ответы (1)


Я нашел ответ после 3 дней отладки. Оказалось, что лучше всего использовать следующую строку, чтобы обновить весь ViewController. Памяти тяжело, но это исправляет огромную ошибку.

[self becomeFirstResponder];
person Giz    schedule 19.12.2012