Прежде всего, позвольте мне упомянуть, что ваши комментарии в основном излишни и делают ваш код труднее читать, а не легче.Сказать мне /* Adding each layer to the layer of the view. */
, когда через строку вы вызываете метод с именем -addSublayer
, это просто шум.Имя -addSublayer
достаточно наглядно.Если люди не могут понять это, они не должны писать код.Кроме того, это не поможет никому, кто должен поддерживать ваш код в будущем (включая вас).Просто будет гораздо больше кода, чем нужно на самом деле.
Во-вторых, у вас есть некоторые ненужные недостатки кода.Вот несколько полезных советов:
Используйте быстрое перечисление.Поскольку петли медленные.
Нет причин создавать ссылку на провайдера данных для загрузки ваших изображений.Просто используйте -imageWithContentsOfFile вместо
Забудьте об использовании CAScrollLayer.Нет пользы от его использования.UIScrollView предоставит все, что вам нужно, и намного проще для реализации .Вы просто устанавливаете свойство contentSize UIScrollView на основе экстентов вашего контента.Это означает, что вы должны рассчитать его, но это гораздо проще, чем пытаться заставить CAScrollLayer работать правильно.Я считаю, что CAScrollLayer вычисляет область содержимого на основе его подслоев, поэтому все, что вы можете сделать, это добавить их, как вы уже делаете.Если прокрутка уже не работает, у вас есть еще одна причина отказаться от нее в пользу UIScrollView.
Вот как я бы упростил ваш код (за исключением замены слоя прокрутки дляпредставление прокрутки. Это оставлено как упражнение для читателя.; -)
- (void)SetView
{
NSString *plistPath = [[NSBundle mainBundle]
pathForResource:plistName ofType:@"plist"];
NSArray *array = [[NSArray alloc] initWithContentsOfFile:plistPath];
int i = 0;
for (NSString *imageName in array) // fast enumeration
{
subLayer = [[CAScrollLayer alloc] init];
NSString *fileName = [[NSBundle mainBundle]
pathForResource:imageName ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:filename];
subLayer.contents = (id)[UIImage
imageWithCGImage:[image CGImage]
scale:2.0
orientation:UIImageOrientationRight].CGImage;
subLayer.frame = CGRectMake(0, 0,480,320);
subLayer.speed = (float)i;
subLayer.zPosition = (float)i;
[self.layer addSublayer:subLayer];
i++;
}
[array release];
}
Наконец, в ответ на вопрос, можете ли вы получить эффект параллакса, я думаю, что это будет довольно сложно, как CoreСлои анимации не поддерживают концепцию угла камеры.Думаю, самое близкое, что вы получите, - это установить преобразование для каждого слоя, который вы добавляете в свою иерархию.Вы можете установить трансформацию z трансформации и включить перспективу (установив поле .m34 структуры CATransfor3D).В этот момент вы можете просто поиграть с вращением содержащего слоя и трансляцией x подслоев, чтобы получить нужный эффект.Суть в том, что этого не произойдет.Вам придется много играть со значениями, и в конечном итоге вам будет лучше использовать OpenGL в зависимости от того, насколько убедительным должен быть ваш параллакс.