У меня есть приложение с CALayers
, которое перемещается с одной стороны экрана на другую.Я пытаюсь подобрать правильное время, чтобы все они заняли одно и то же время, чтобы перейти от первой стороны к произвольному разделителю, который я выбрал (рядом с другой стороной), а затем продолжить свой пробег, чтобы исчезнуть с экрана.
Вот пример того, что я имею в виду:
Оба блока должны двигаться с одинаковой скоростью (анимация имеет линейное время), поэтому, когда маленький блок попадает вразделитель, небольшой разрыв между ними должен быть одинаковым.
Однако я скорее вижу это:
Выражение словами, кажется, что мой большойкоробка движется быстрее, чем маленькая коробка.
Вот соответствующая часть моего кода.Я определяю скорость в пикселях в секунду, затем устанавливаю продолжительность анимации, учитывая количество пикселей, которые должны перемещаться.
const CGRect viewBounds = CGRectMake(0,0, 500, 400);
const CGFloat distanceToCross = viewBounds.size.width - delimiterX;
const CFTimeInterval timeToCross = 5;
const CGFloat pixelsPerSecond = distanceToCross / timeToCross;
const CGFloat y = /* y coordinate of the box */;
CALayer* box = [CALayer layer];
// the layer should lie outside the viewport at first
box.frame = CGRectMake(viewBounds.size.width, y, /* size here */);
box.anchorPoint = CGPointMake(0, 0.5);
// snip
[CATransaction begin];
CATransaction.animationTimingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
CATransaction.animationDuration = (viewBounds.size.width + box.frame.size.width) / pixelsPerSecond;
// and the layer should cross the viewport to outside of it, too
box.position = CGPointMake(-box.frame.size.width, y);
[CATransaction commit];
Это не показано в моем графическом примере, но блоки такого же размеравсе идут с одинаковой скоростью, поэтому, очевидно, я делаю что-то не так с моим расчетом времени.Чего мне не хватает?