Чтобы сделать то, что вы хотели, вот как вы можете изменить свой код. В loadImage:
используйте эту строку, чтобы добавить UIImage
, который вы загрузили в слой earth
:
self.contents = image.CGImage;
CALayers
имеет свойство contents
, которое можно установить на CGImage
, вместо того, чтобы использовать вызовы Core Graphics для рисования изображения в контексте слоя.
Затем в родительском подклассе UIView
вы можете добавить earth
к иерархии представления следующим образом:
[self.layer addSublayer: earth];
Обратите внимание, что earth
сам по себе CALayer
с изображением в качестве его содержимого, поэтому я добавляю его непосредственно в качестве подслоя. Другая вещь, которую я всегда забываю сделать, это установить свойство слоя frame
. В противном случае его ширина и высота будут равны нулю и поэтому не будут отображаться.
В своем коде вы создали слой, но никогда не добавляли его в иерархию представлений. Есть дерево if views (класс UIView) и их подпредставления. Корнем дерева является [UIWindow mainwindow] (обратите внимание, что UIWindow является подклассом UIView
. Каждый UIView
имеет свойство layer
типа CALayer
, которое фактически содержит видимое содержимое. UIView
это просто Оберните вокруг CALayer
, чтобы добавить такие вещи, как способность обрабатывать прикосновения.
Важная идея, которую вам здесь не хватает, заключается в том, что для того, чтобы что-либо было видно на экране, оно должно быть частью этого дерева представлений с UIWindow в качестве его корня, и все представления должны быть видимыми (т.е. иметь свои hidden
свойство установлено на NO
) между окном верхнего уровня и соответствующим слоем. Только тогда слой будет виден на экране. Так что где-то в вашем коде вам нужно добавить свой слой как подслой чего-то уже видимого, вызвав addSublayer:
.
В вашем случае я предполагаю, что earth
является экземпляром CALayer
, и что вы сделали в методе loadImage:
, это создали новый CALayer
(с вызовом [CALayer layer]
) в слой earth
, но вы никогда не добавляли этот новый слой ни к чему, чтобы он никогда не становился видимым. Вместо этого вы попытались добавить слой earth
, который по-прежнему не имеет содержимого, к тому, что я считаю слоем UIView
[[собственный слой] addSublayer: [слой земли]];
Одна проблема с этой строкой в том, что вы, кажется, думаете, layer
является свойством earth
. На самом деле layer
- это метод класса CALayer
, который является фабричным методом для создания новых экземпляров CALayer
. Это сбивает с толку, потому что [self layer]
фактически обращается к свойству layer экземпляра UIView
. (Я предполагаю, что self
относится к экземпляру UIView
подкласса.)