Новый CALayer.contents не отображается, пока размер представления не изменится - PullRequest
4 голосов
/ 21 августа 2011

У меня есть CALayer, который должен отображать кадры видео. Каждый раз, когда кадр отображается (как CGImageRef), этот метод вызывается:

- (void)displayFrame:(CGImageRef)frame {
    [view layer].contents = (id)frame;
}

Что странно, это то, что сначала это ничего не отобразит. Каждый раз, когда view изменяется, отображается новый frame, но остается до тех пор, пока view не будет изменен.

Как мне это исправить?

Ответы [ 3 ]

5 голосов
/ 22 августа 2011

Является ли displayFrame: вызываемым в главном потоке? Если нет, то я обнаружил, что это не всегда будет рисовать. Вы можете попробовать принудительно обновить его, используя [CATransaction flush], например:

- (void)displayFrame:(CGImageRef)frame {
    [view layer].contents = (id)frame;
    [CATransaction flush];
}

Если это не сработает, вы можете попытаться включить код построения слоя, чтобы помочь выявить любые особенности этого слоя.

2 голосов
/ 21 августа 2011

Вам, вероятно, нужно сделать [[view layer] setNeedsDisplay]. Система рисования должна быть проинформирована о том, что были сделаны обновления, и экран должен быть перекрашен. Изменение размера представления делает это, но кажется, что изменение contents слоя не может.

0 голосов
/ 04 сентября 2014

Использование [CATransaction flush]; помогло мне. Я должен выяснить, какой (если он есть) удар по производительности я использую для отображения текста с использованием этого подхода.

...