2012-05-13 1 views
5

Как изменить myLayer.contents на набор изображений (т. Е. Переключение между img1 и img2) во время перевода? благодаря!изменение изображения во время трансляции

UIImage *myImage = [UIImage imageNamed:@"img1.png"]; 
CALayer *myLayer = [CALayer layer]; 
myLayer.contents = (id)myImage.CGImage; 
myLayer.Position = CGPointMake(0,0); 
myLayer.Bounds=CGRectMake(0.0, 0.0, 50, 50); 
[self.view.layer addSublayer:myLayer]; 

//translation1 
CGPoint startPt = CGPointMake(10,10); 
CGPoint endPt = CGPointMake(100,100);  
CABasicAnimation *transl1 = [CABasicAnimation animationWithKeyPath:@"position"]; 
transl1.removedOnCompletion = FALSE; 
transl1.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
transl1.fromValue = [NSValue valueWithCGPoint:startPt]; 
transl1.toValue = [NSValue valueWithCGPoint:endPt]; 
transl1.duration = 3; 
transl1.fillMode = kCAFillModeForwards; 
transl1.beginTime = 0; 
[myLayer addAnimation: transl1 forKey: nil]; 
+1

Фактически я думаю, что он имел в виду перевод, в математическом переводе движется объект к другой координате – MCKapur

ответ

2

Шагающий человек пример:

Я имел дело с точно такими же задачами, но я должен был сделать бегущую пауку, который 6 ножки ходьбы и имеет 12 кадров. На самом деле это было очень сложно сделать, и мне потребовалось несколько месяцев, чтобы совершенствоваться. Дело в том, что пример бодрствующего человека обычно делается путем установки массива кадров изображений (первый этап, последний этап) в свойство animationImages UIImageView. Затем вы включаете и выключаете анимацию вместе с движущимся персонажем справа и слева и тем самым создаете иллюзию ходьбы. Теперь возникает большая проблема, когда вы хотите создать иллюзию ускорения. Невозможно изменить продолжительность анимации ВО ВРЕМЯ воспроизведения анимации, и это серьезная неудача, которую очень трудно преодолеть.

Вот код, который я продюсировал, чтобы преодолеть эту проблему:

Здесь Вы можете определить массив с кадрами ходьбы ноги, кадр за шагом.

animationImagesSpider = [NSArray arrayWithObjects: 
[UIImage imageNamed:@"[email protected]"], [UIImage imageNamed:@"[email protected]"], [UIImage imageNamed:@"[email protected]"], [UIImage imageNamed:@"[email protected]"], [UIImage imageNamed:@"[email protected]"], [UIImage imageNamed:@"[email protected]"], [UIImage imageNamed:@"[email protected]"], [UIImage imageNamed:@"[email protected]"], [UIImage imageNamed:@"[email protected]"], [UIImage imageNamed:@"[email protected]"], [UIImage imageNamed:@"[email protected]"], [UIImage imageNamed:@"[email protected]"], nil]; 

Здесь вы присоедините массив в UIImageView:

imgViewSpider = [[UIImageView alloc] initWithFrame:CGRectMake(200,410,100,145)]; 
imgViewSpider.animationImages = animationImagesSpider; 

Теперь, если вы просто звоните [imgViewSpider startAnimating]; это запустит анимацию с постоянной скоростью, пока вы ее не остановите. Для преодоления этого я использовал рекурсию, который играет короткую анимацию для каждого шага, и это позволяет регулирует длительность между каждыми шагами:

- (void) spiderRun { 

    imgViewSpider.animationDuration= 0.51-(accSp/3.5); 
    [imgViewSpider setAnimationRepeatCount:222]; /// this is a dummy value that has no effect because animtion ends after the first frame 
    [imgViewSpider startAnimating]; 
    [self performSelector:@selector(spiderRun) withObject:nil afterDelay: 0.5-(accSp/3.5)]; 

} 

Постоянно меняя значение accSp, я могу контролировать скорость ходьбы во время ходьбы ,

+0

спасибо, я собираюсь попробовать! ciao, Джузеппе – Beppino66

0

Вам нужно будет создать вторую анимацию transl2, эта анимация сделает обмен изображениями. Вам нужно будет установить продолжительность до половины длительности трансляции, чтобы она упала в середине анимации transl1.

transl1.duration = 3

transl2.duration = 1,5

+0

спасибо, это нормально. Я также хотел бы вернуться к img1, а затем вернуться к img2 ...., чтобы имитировать движение ..... в какой части кода я могу сказать это? ciao – Beppino66

+0

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

+0

Извините меня за мое замешательство ...теперь я знаю, как перемещать слой в экран, с переводами, вращениями и т. д. ... проблема в том, что содержание айера - это одна и та же картина, и я бы хотел изменить его во время анимации (например,), поэтому мне нужно зациклиться между набором изображений: img1, img2, img1, img2 .... во время перевода ... – Beppino66

1

Как сказал другой плакат, создать вторую анимацию, которая оживляет содержимое свойства слоя на новое изображение.

Я бы предложил разместить обе анимации в группу анимации и добавить группу анимации к слою. Затем вы можете легко контролировать продолжительность и время начала анимации. Вы могли бы сделать смену изображения на части общей продолжительности, рассчитанной на середину анимации.

Вы установили бы начало анимации с использованием свойства beginTime и продолжительности с свойством duration.

+0

спасибо большое Duncan! ciao – Beppino66