iPhone хиттест сломан после поворота - PullRequest
3 голосов
/ 04 апреля 2010

У меня есть UIView, который содержит несколько подклассов CALayer. Я использую следующий код, чтобы определить, какому слою соответствует событие касания:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self];
NSLog(@"%@,%@",NSStringFromCGPoint(point),[self.layer hitTest:point].name);


}

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

После поворота метод hitTest последовательно возвращает ноль для слоя. Я заметил, что при повороте на 180 градусов возвращенный слой - это то, что находилось в этом месте до поворота, то есть касание верхнего левого слоя дает слой в правом нижнем углу при повороте на 180 градусов. Координаты теста попадания печатаются, как ожидается, с (0,0) слева вверху. Я перерисовываю слои с каждым поворотом, но по какой-то причине они, кажется, отображаются как «правильный» путь вверх, с кнопкой «Домой» внизу. Я пропускаю вызов функции или что-то после обработки вращения?

Ура, Адам

1 Ответ

4 голосов
/ 05 апреля 2010

Хорошо, я обнаружил, что следующий код работает во всех направлениях без каких-либо проблем (в моем случае нет перекрывающихся представлений, поэтому это подходит для меня):

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *t = [touches anyObject];

    CGPoint point = [t locationInView:self];

    for(CALayer *layer in self.layer.sublayers) {

        CGPoint convertedPoint = [self.layer convertPoint:point
                                                  toLayer:layer];

        if([layer containsPoint:convertedPointPoint]) {
            NSLog(@"%@",layer.name);
        }
    }
}

Хотя это ручное преобразование точек работает правильно, все еще остается вопрос, почему исходный вызов метода этого не сделал. Кто-нибудь может просветить меня?

Адам

...