ShapeLayer HitTest на пути не работает для меня - PullRequest
1 голос
/ 29 ноября 2011

У меня к вам быстрый вопрос, ребята.

У меня есть shapeLayer, в котором я устанавливаю рамку. Затем я рисую фигуру внутри содержимого фрейма с помощью UIBezierPath, который я установил в shapeLayer.path

Вопрос в том, как определить, что касание внутри фигуры является истинным, а за пределами фигуры ложным?

Я пробовал все сумасшедшие вещи, но никто не работает

-(Boolean) isPoint:(CGPoint)point InsideShape:(CSAbstractShapeLayer*) shapeLayer fromSuperLayer:(CALayer*) sLayer
{ 
    CGPoint locationPoint   = point;
    locationPoint           = [sLayer convertPoint:locationPoint toLayer:shapeLayer];        
    CGAffineTransform at    = shapeLayer.affineTransform;            
    return CGPathContainsPoint([shapeLayer path],&at, locationPoint, NO);       
}


-(Boolean) isPoint:(CGPoint)point InsideShape:(CSAbstractShapeLayer*) shapeLayer fromSuperLayer:(CALayer*) sLayer
{ 
    CGPoint locationPoint   = point;        
    locationPoint           = [sLayer convertPoint:locationPoint toLayer:shapeLayer];        
    return [[UIBezierPath bezierPathWithCGPath:shapeLayer.path] containsPoint:locationPoint];    
}


-(Boolean) isPoint:(CGPoint)point InsideShape:(CSAbstractShapeLayer*) shapeLayer fromSuperLayer:(CALayer*) sLayer
{ 
    CGPoint locationPoint   = point;        
    locationPoint           = [sLayer convertPoint:locationPoint toLayer:shapeLayer];        
    CGRect theRect = CGPathGetBoundingBox(shapeLayer.path);
    return CGRectContainsPoint(theRect, locationPoint);    
}

ПРИМЕЧАНИЕ 1. Кажется, что я пока не могу опубликовать изображение, поэтому изобразите прямоугольник с диагональной линией внутри, Правая сторона линии - это форма, поэтому мне нужно определить отвод внутри как ДА, а снаружи (слева от линии и снаружи прямоугольника) как НЕТ

ПРИМЕЧАНИЕ 2. Может быть, это могло бы помочь, но я не могу понять это ... Я обнаружил, что если вы создаете shapeLayer и добавляете CGPath в shapeLayer.path и не предоставляете фрейм, рамка и граница shapeLayer равны [0,0,0,0], хотя фигура отображается на экране, поэтому [view.layer hitTest: point] не найдет shapeLayer в качестве цели. из-за этого я предоставил рамку и привязку к своему shapeLayer.

Большое спасибо за ваше время!

1 Ответ

0 голосов
/ 05 декабря 2011

Короче говоря,

На уровне слоя я использовал точку, полученную из View (locationInView), а затем выполнил преобразование в слой, поэтому этот слой имел родительский слой, поэтомуМне нужно было сделать два преобразования

Так что, если посмотреть на этот метод, я отправил вам на днях

-(Boolean) isPoint:(CGPoint)point InsideShape:(CSAbstractShapeLayer*) shapeLayer fromSuperLayer:(CALayer*) sLayer
{

 
    CGPoint locationPoint   = point;

        
    locationPoint           = [sLayer convertPoint:locationPoint toLayer:shapeLayer];       

 
    return [[UIBezierPath bezierPathWithCGPath:shapeLayer.path] containsPoint:locationPoint];    

}

Я должен был сделать следующее

  1. locationPoint = [ sLayer.superlayer convertPoint: locationPoint toLayer: sLayer];

  2. locationPoint = [ sLayer convertPoint: locationPoint toLayer: shapeLayer];

Итак, от суперслоя parentLayer к себе, затем от него к childLayer

Надеюсь, что помочь кому-то

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