Ответ 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, например, если бы все ваши текстуры были подкреплены изображениями, которые были скомпилированы в ваше приложение во время сборки.
Надеюсь, это поможет. Оставьте комментарии, если вам нужно разъяснение, и я отредактирую обязательство.