2016-03-25 2 views
1

У меня есть анимация в прошивке со следующим кодом:Choppy анимации в прошивкой

view.layoutIfNeeded() 

UIView.animateWithDuration(0.3, delay: 0, options: .CurveEaseInOut, animations: { 

    // constraints which are unrelated to drawingResultsController 
    self.leadingSpaceToContainerViewConstraint.constant = 0 
    self.trailingSpaceToContainerViewConstraint.constant = 0 

    // This controller doesn't have any constraints 
    drawingResultsController.view.frame.origin = CGPoint(x: self.view.bounds.width, y: 0) 
    self.view.layoutIfNeeded() 

}, completion: { finished in 

    drawingResultsController.view.removeFromSuperview() 
    drawingResultsController.removeFromParentViewController() 
    drawingResultsController.didMoveToParentViewController(nil) 
}) 

однако, анимация не выглядит очень текучей. Это не ужасно, но вы можете определенно сказать, что это способ до 30 кадров в секунду. Кто-нибудь знает, почему это может быть? Я уже проверил, что все идет по основному потоку.

Дополнительные детали: вид

материнского контроллера имеет подвид, который прижат к краям это SuperView (главный вид), те ограничения видели выше. Этот подсмотр содержит основные виды контроллера (т. Е. Он создает эффект параллакса, так как рисунок ResultsController скользит по экрану и выходит из него). drawingResultsController - это контроллер детского представления, добавленный в качестве подзона основного вида, и у него нет никаких ограничений. Он скользит по экрану и выходит из него, и это код для его выталкивания.

Таким образом, вид, перемещаемый ограничениями, является братом вида изображения ResultsController. Оба являются прямым подзором основного вида.

РЕДАКТИРОВАТЬ:

Уменьшение анимации именно этот

UIView.animateWithDuration(0.3, delay: 0, options: .CurveEaseInOut, animations: { 

    drawingResultsController.view.frame.origin = CGPoint(x: self.view.bounds.width, y: 0) 

}, completion: nil) 

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

Спасибо

+0

Вы используете другие приложения @ одновременно? О какой платформе вы говорите? – user3069232

+0

Во-первых, ограничение есть на каком виде? Если они находятся на рисункеResultsController, вы не должны использовать фрейм. Также это вид, который мгновенно удаляется. Затем вам нужно использовать альфу, чтобы затемнить вид, а затем удалить его. –

+0

Спасибо за ответ. Добавлено несколько деталей на вопрос. Проблема возникает как в симуляторе, так и в самом устройстве. – diegomontoyas

ответ

0

По-видимому, он решил сам по себе. Это не имеет большого смысла, поскольку это произошло как в симуляторе, так и в устройстве, и никакой код не был изменен.

1

У меня была аналогичная проблема, оказалось, что она решается перезагрузкой устройства.

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

Взлом ниже решает проблему. Добавьте код в класс основного окна (если вы используете пользовательский подкласс UIWindow для вашего главного окна):

//Hack for slow animation problem that occurs after long uptime of the device, updating a view's layer position that's in the view hierarchy using a display link solves the slow animations. 

@property (nonatomic, strong) UIView *dummyView; 
@property (nonatomic, strong) CADisplayLink *displayLink; 

- (void)enableSlowAnimationHack { 
    if (self.dummyView == nil) { 
     self.dummyView = [[UIView alloc] initWithFrame:CGRectZero]; 
     [self addSubview:self.dummyView]; 
    } 
    if (self.displayLink == nil) { 
     self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(animateWithLink:)]; 
     [self.displayLink addToRunLoop: [NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 
    } 
} 

- (void)animateWithLink:(CADisplayLink *)sender { 
    self.dummyView.layer.position = CGPointMake((arc4random() % 100)/100.0, (arc4random() % 100)/100.0); 
} 
Смежные вопросы