Подтвердить что ты не робот

Связь между CoreGraphics, UIViews и CALayers

Я всегда использовал CoreGraphics и CoreAnimation, я понимаю, как каждый из них работает сам по себе, но не те крайние случаи, когда приходится разговаривать с другим. Я также понимаю, что UIView - хорошая оболочка для CALayer, где CALayer выполняет весь тяжелый подъем рендеринга, а UIView добавляет отзывчивость.

Но все вопросы, которые я видел до сих пор, атакуют проблему с одной или другой стороны, а не взаимодействие между ними, особенно между CoreGraphics и CALayer.

В любом случае, мой вопрос...

Как CoreGraphics относится к CALayer?

Я понимаю, что CALayer обертывает методы CoreGraphics, чтобы рисовать сам, но делает это один раз и может жить с моментальным снимком самого себя до тех пор, пока не будет отменен. Но как эти методы рисования взаимодействуют с подслоями этого слоя? Являются ли они эксклюзивными?

Например, что происходит, когда у меня есть UIView, который имеет под-представления, и я перегружаю метод drawRect? Как это влияет на рисование его подслоев?

Можно ли даже смешать две функции внутри одной и той же функции?

Кроме того, я спрашиваю только об iOS, я понимаю, что Mac - это другой зверь (а также эти фантазии CIFilters, ублюдки!).

Предварительные исследования

Вот некоторые связанные вопросы, которые я изучил заранее:

4b9b3361

Ответ 1

Я постараюсь ответить на ваш вопрос на концептуальном уровне 20 000 футов. Я попытаюсь отказаться от своих моментов, в которых я слишком обобщаю, но я попытаюсь разобраться в общем случае.

Возможно, самый простой способ подумать об этом: в памяти GPU у вас есть текстуры, которые для целей этого обсуждения являются растровыми изображениями. У CALayer может быть связанная с ним текстура, а может и нет. Эти случаи соответствовали бы слою с методом -drawRect: и слою, который существует только для того, чтобы содержать подслои, соответственно. Понятно, что каждый слой, имеющий связанную с ним текстуру, имеет другую текстуру, которой он владеет (есть некоторые детали и оптимизации, которые делают это не строго/универсально истинным, но в общем абстрактном случае это может помочь подумать об этом way.) С учетом этого метод superlayer -drawRect: не влияет ни на один из его методов -drawRect: подслоев, и (опять же, в общем случае) метод подслоя -drawRect: не влияет на его суперслой -drawRect:. Каждый рисует свою собственную текстуру (также называемую "хранилищем резервных копий" ), а затем, основываясь на дереве слоев и связанных с ним геометриях и преобразованиях, графический процессор объединяет все эти текстуры вместе в то, что вы видите на экране. Когда один из уровней недействителен, прямо или косвенно (через -setNeedsDisplayInRect:), тогда, когда CA переходит к отображению следующего кадра на экране, недопустимые слои будут перерисовываться в силу вызова их методов -drawRect:. Это обновит связанную текстуру, и как только все текстуры недействительных слоев будут обновлены, GPU будет их комбинировать, создавая окончательное растровое изображение, которое вы видите на экране.

Итак, чтобы ответить на ваш первый вопрос: в общем случае нет, нет взаимодействия между методами -drawRect: различных CALayers.

Что касается вашего второго вопроса: для целей этого обсуждения вы можете думать о том, что UIViews являются такими же, как CALayers. Взаимосвязь в отношении рисования и текстур в значительной степени не изменилась по сравнению с не-UIView CALayers.

К вашему третьему вопросу: полезно ли смешивать UIViews и CALayers? Каждый UIView имеет CALayer, поддерживающий его (все представления в UIKit поддерживаются с помощью слоя, что обычно не имеет места в OSX.) Таким образом, на некотором уровне они "перемешаны", хотите ли вы, чтобы они были или нет. Совершенно прекрасно добавлять подуровни CALayer на слой, который поддерживает UIView, хотя этот слой не будет иметь всех добавленных функций, которые UIView приносит стороне. Если целью этого слоя является просто создание изображения для отображения, то это прекрасно. Если вы хотите, чтобы подслой/представление являлся участником первого класса при обработке касания или располагался/определялся с помощью AutoLayout, тогда он должен быть UIView. Вероятно, лучше всего подумать о UIView как CALayer с добавлением дополнительной функциональности. Если вам нужна эта функциональность, используйте UIView. Если вы этого не сделаете, используйте CALayer.

В сумме: CoreGraphics - это API для рисования 2D-графики. Одним из распространенных способов использования CG (но не единственного) является рисование растровых изображений. CoreAnimation - это API, обеспечивающий организованную структуру для управления растровыми изображениями на экране. Вы могли бы использовать CoreAnimation без использования примитива рисунка CoreGraphics, например, если бы все ваши текстуры были подкреплены изображениями, которые были скомпилированы в ваше приложение во время сборки.

Надеюсь, это поможет. Оставьте комментарии, если вам нужно разъяснение, и я отредактирую обязательство.