Проблема в том, что при выполнении анимации «анимации движения» с Core Animation (что происходит неявно при использовании методов анимации UIView
), новое значение немедленно применяется к так называемому дереву слоя модели . .
Анимация передается в Core Animation, и в следующий раз, когда происходит основной цикл выполнения, Core Animation выполняет необходимый рендеринг, чтобы он выглядел так, как будто происходит анимация. Однако в действительности значения модели вашего представления (например, свойства frame
или transform
) изменяются немедленно.
Попробуйте нажать в нижней части экрана, где кнопки приземляются (при условии, что они заканчиваются на экране). Если вы сделаете это, он должен реагировать на событие взаимодействия, как вы ожидаете.
Вы можете вручную изменить рамку своих кругов, постоянно включая таймер и применяя небольшие изменения на каждом шаге. Это, однако, вероятно, не идеально.
Другой вариант - использовать метод слоя presentationLayer
вашего вида. Этот слой представляет состояние слоя в любой момент времени, как мы видим его на экране. Вдобавок ко всему, я представляю, что метод обработки касания вашего основного вида может выполнять итерацию по каждому подпредставлению и проверять, пересекает ли точка касания рамку уровня представления слоя подпредставления. Если это так, то это означает, что кто-то «прикоснулся» к вашему подпредставлению.
for (UIView *subview in self.subviews)
{
CALayer *presentationLayer = (CALayer *)[subview.layer presentationLayer];
if (CGRectContainsPoint(presentationLayer.frame, touchPoint)
{
// Found the subview the user touched
}
}
Следует отметить, что presentationLayer
возвращает id
, поскольку уровень представления может быть CALayer
или любым из его подклассов. Так, например, если вы используете CAShapeLayer
, то -presentationLayer
вернет CAShapeLayer
. Тем не менее, можно просто привести его к CALayer
, поскольку все, что вам нужно для выполнения этой задачи, - это проверить его свойство frame
.