Как настроить CALayer с использованием подклассов - PullRequest
1 голос
/ 18 января 2012

На UIView есть количество CALayers. Каждый CALayer состоит из CAShapeLayers. Свойство пути CAShapeLayers состоит из UIBezierPath.

Моя цель - когда я нажимаю на CALayer, я хочу получить очки, которые я использовал на чертеже UIBezierPath. Для этого я подумал о создании подкласса CALayer, который имеет NSMutableArray для хранения точек. Я буду сохранять баллы, когда буду рисовать, в частности, CALayer. Поэтому, когда я нажимаю на конкретный CALayer, я получаю очки, связанные с этим. Также я хочу дать тег каждому CALayer. Я не знаю, как это сделать.

Второй способ - использовать встроенное свойство CALayer, которое даст мне очки, полученные в CALayer. Но я не знаю об этой собственности.

Пожалуйста, поделитесь своими идеями, как выполнить эту задачу?

1 Ответ

2 голосов
/ 19 января 2012

Вам нужно будет использовать UIView, который содержит CALayer для обработки сенсорных событий, для CALayers нет встроенных сенсорных событий. - (CALayer *)hitTest:(CGPoint)thePoint возвращает самый глубокий CALayer, в котором находится точка от события касания. Таким образом, если вы позвоните [self.layer hitTest:point], он проверит все ваши подслои и вернет правильный CALayer

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint point = [[touches anyObject] locationInView:self];
    CALayerSubclass *taplayer = [self.layer hitTest:point]
    NSArray *points = [taplayer getPoints];
}

Невозможно вывести из CGPath очки, которые вы в него кормили. Лучшее, что вы можете сделать, это эти методы о получении информации с пути. Итак, как вы сказали, лучше всего подкласс CALayer и поместить всю необходимую информацию в структуру данных для последующего извлечения.

// .h
@interface CALayerSubclass : CALayer

@property (nonatomic, strong) NSMutableArray *points;

@end

// .m
-(void)drawInContext:(CGContextRef)ctx {
    ...
    [bezierPath addCurveToPoint:controlPoint1:point1 controlPoint2:point2];
    [points addObject:[NSValue valueWithCGPoint:point1]];  
    [points addObject:[NSValue valueWithCGPoint:point2]];  
    ...
}

Просто сохраните все CGPoints (или большинство других структур Core Graphics) в NSValue и бросьте их в массив.

...