2013-06-17 3 views
0

Заранее спасибо: У меня есть иерархия вида, как это:IOS: CAShapeLayer, CALayer маска, Трассировка: WithEvents, Трассировка:

UIView в этом я поставил: CALayer * layer = (CALayer*) self.layer

И в этом классе I имеют CAShapeLayer, который устанавливается как маска CALayer.

Он анимирует отлично, без проблем.

У меня есть UIViewController, что INIT вышеуказанную UIView по:

myView = [myAnimationView alloc] initWithFrame:(CGRect){{0, 0}, 320, 450}]; [self.view addSubview myView];

Так что у меня есть это: UIView класс и выше UIViewController класса. Ничего больше.

Как CAShapeLayer оживляет (это только основной ча анимация, масштабирование от небольшого круга большего размера), я надеюсь, что смогу, чтобы получить точку касания в UIViewController, что inits этот UIView

Должен ли я использовать hitTest: WithEvents: здесь? Я пробовал это, но его называют три раза. Вернувшиеся точки верны, но я надеялся найти способ узнать, касаются ли анимированное представление из вида контейнера. Другими словами, я хотел бы знать, будет ли затронут subView/subLayer.

В общем, вот моя точка зрения иерархии:

UIViewController инициализирует UIView класс и добавляет его как подвид. В этом классе UIView его слой установлен в CALayer на CALayer * layer = (CALayer *) self.layer, а CAShapeLayer задан как маска CALayer, а анимация установлена ​​на пути слоя фигуры.

И я хотел бы, чтобы иметь возможность получить слой прикоснулся в UIViewController

Можно ли получить точку касания от слоя, который в настоящее время одушевленной CAShapeLayer в представлении которого слой устанавливается равным CALayer от a UIViewController, который добавляет его в качестве подзаголовка? Просьба привести примеры.

Большое спасибо за внимание. С уважением.

ответ

0

Я думаю, что CALayer не предназначен для приема/обработки событий касания (что является одним большим отличием от UIView). я тестировал на (длительное нажатие) прикосновением в течение CAShapeLayer.path от ViewController с чем-то вроде

- (void)handleLongPress:(UILongPressGestureRecognizer *)recognizer { 
    CGPoint currentPoint = [recognizer locationInView:self.overlayView]; 
    bool didSelect = [self selectPathContainingPoint:currentPoint]; 
    if (didSelect) { 
     [self updateViews]; 
    } 
} 

- (BOOL)selectPathContainingPoint:(CGPoint)point { 
    CALayer * layer = (CALayer *) self.layer; 
    CAShapeLayer *mask = (CAShapeLayer *)layer.mask; 
    return CGPathContainsPoint(mask.path, nil, point); 
} 

Там в один нюанс, однако: мой путь не анимированные. В документах для CAShapeLayer он также ничего не говорит, если обновляется свойство CAShapeLayer.path во время анимации.

0

попробовать что-то вроде этого:

- (void)setup 
{ 
    _maskLayer = [CAShapeLayer layer]; 
    _maskLayer.fillColor = [UIColor whiteColor].CGColor; 
    _maskLayer.path = somePath; 

    _theLayer.frame = CGRectMake(0, 0, size.width, size.height); 

    // Apply a mask 
    _maskLayer.frame = _theLayer.frame; 
    _theLayer.mask = _maskLayer; 
} 

- (IBAction)tapOnView:(UITapGestureRecognizer *)sender 
{ 
    CGPoint point = [sender locationInView:theView]; 
    CALayer *subLayer = [_theLayer.presentationLayer hitTest:point].modelLayer; 

    if (subLayer != _theLayer && subLayer != nil) { 
     // Do something with the sublayer which the user touched 
    } 
} 

Вы должны настроить ваш TapGestureRecognizer, я сделал это с помощью Interface Builder, но вы можете сделать это в коде, если вы хотите. Убедитесь, что ваши слои имеют правильную настройку границ, и вам также необходимо установить границы вашей маски.

Обратите внимание, что я получаю презентационный слой и преобразовываю его обратно в реальный слой. Это заставит его работать с анимацией.

Я надеюсь, что это сработает для вас.

Смежные вопросы