Определение, какое подпредставление было затронуто - PullRequest
1 голос
/ 20 февраля 2012

Я пробую анимацию на iPhone, и у меня есть небольшое приложение, в котором круги падают сверху вниз на экран.Я добавил опцию UIViewAnimationOptionAllowUserInteraction к анимации и установил userInteractionEnabled = YES как для моих подвидов, так и для основного вида.Я генерирую подпредставление программно каждый раз, когда запускается мой NSTimer, из-за чего появляются круги.

Проблема, с которой я сталкиваюсь, заключается в том, что даже если я реализую - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event в моем основном представлении и моих подпредставлениях, событие запускается толькоосновной вид, независимо от того, насколько сильно или сколько раз я разбиваю падающие круги.

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

1 Ответ

2 голосов
/ 20 февраля 2012

Проблема в том, что при выполнении анимации «анимации движения» с 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...