анимация pushviewcontroller медленная / прерывистая - PullRequest
28 голосов
/ 12 января 2012

Я нажимаю ViewController, который содержит не слишком много представлений, UIScrollView, который содержит 10 представлений внутри, у меня есть синглтон ViewController, и я нажимаю его снова и снова, не освобождая и не выделяя снова ViewController, поэтому всечто я делаю в viewDidLoad() и viewWillAppear(), но анимация медленная и прерывистая, что бы это могло быть?

Ответы [ 6 ]

91 голосов
/ 02 октября 2013

У меня была проблема, когда UIViewController A выполнял pushViewController для нажатия UIViewController B, анимация push останавливается на уровне около 25%, останавливается, а затем скользит B в остальной части пути.

Этот DIDЭтого не происходит в iOS 6, но как только я начал использовать iOS 7 в качестве базового SDK в XCode 5, это начало происходить.

Исправление состоит в том, что в контроллере представления B не было установлено backgroundColor в его корневом представлении.(корневым представлением является значение viewController.view, которое вы обычно устанавливаете в loadView).Установка backgroundColor в инициализаторе этого корневого представления устранила проблему.

Мне удалось исправить это следующим образом:

// CASE 1: The root view for a UIViewController subclass that had a halting animation

- (id)initWithFrame:(CGRect)frame

{

     if ((self = [super initWithFrame:frame])) {

          // Do some initialization ...

          // self.backgroundColor was NOT being set

          // and animation in pushViewController was slow and stopped at 25% and paused

     }

     return self;

}

// CASE 2: HERE IS THE FIX

- (id)initWithFrame:(CGRect)frame

{

     if ((self = [super initWithFrame:frame])) {

          // Do some initialization ...

          // Set self.backgroundColor for the fix!

          // and animation in pushViewController is no longer slow and and no longer stopped at 25% and paused

          self.backgroundColor = [UIColor whiteColor]; // or some other non-clear color

     }

     return self;

}
28 голосов
/ 13 июня 2014

Единственное решение этой проблемы, никогда не устанавливайте цвет фона основного вида на чистый цвет.

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

4 голосов
/ 12 января 2012

Вы можете начать с использования Instruments> Time Profiler и посмотреть, есть ли какая-то часть вашего кода, которая занимает больше времени, чем необходимо.

Вы также можете использовать инструмент «Инструменты> Базовая анимация», который можно использовать для пометки частей экрана, которые не эффективно рисуют / анимируют.

Если вы используете старый iPhone или оригинальный iPod - со сложными экранами, я заметил, что некоторые приложения немного нестабильны.

0 голосов
/ 30 июня 2016

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

Я столкнулся с той же проблемой сегодня.Я копался в теме, и похоже, что это связано с тем, что основной цикл запуска спит.

См. this .

0 голосов
/ 23 сентября 2015

Моя проблема в том, что я помещаю коды массовой загрузки в viewWillAppear. Мой случай

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    tableView.reloadData()
}

И у меня много строк, поэтому pushViewController отстает.

0 голосов
/ 16 июля 2014

У меня была эта проблема, и это было из-за старого кода в контроллере push-представления, который заставлял представление "исчезать", устанавливая альфа в 0 в viewWillAppear и устанавливая альфа в 1 в viewDidAppear.

Я удалил старый код, который делал это, и push работал нормально.

-(void)viewWillAppear {
    self.view.alpha = 0; //REMOVE THIS LINE
}
...