Мне нужно сделать какой-то учебник в моем приложении. Идея заключается в том, что пользователь видит вид прозрачного, но слегка затемненного наложения с отверстием в нем. Это отверстие является единственной зоной, которая позволяет проникать сквозь нее. Решение этой проблемы прост - вам просто нужно реализовать - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
или даже - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
, где вы проверяете зону и проходите только те штрихи, которые хотите пройти.Прохождение событий касания через зону в движущемся UIView
Затем, например, этот вид начинает двигаться. Движение вызвано некоторой базовой анимации, как это:
[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat animations:^{
self.tutorialHoleView.center = CGPointMake(self.tutorialHoleView.center.x-160.0, self.tutorialHoleView.center.y);
} completion:nil];
Вы ожидали бы вид, чтобы сохранить прохождение штрихи только в определенной зоне, но это не так - здесь мы говорим о self.layer.presentationLayer
свойстве зрения. Итак, вам нужно создать SuperView где вы сделать что-то вроде этого:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UIView * subview in [self subviews]) {
if ([subview isKindOfClass:[ETTutorialFlashlightView class]]) {
ETTutorialHoleView * tutorialView = (ETTutorialHoleView *)subview;
CGPoint point = [[touches anyObject] locationInView:self];
CGRect presentationFrame = [tutorialView.layer.presentationLayer frame];
if ((point.x >= presentationFrame.origin.x+presentationFrame.size.width/2.0-75.0) && (point.x <= presentationFrame.origin.x+presentationFrame.size.width/2.0+75.0) && (point.y >= presentationFrame.origin.y+presentationFrame.size.height/2.0-75.0) && (point.y <= presentationFrame.origin.y+presentationFrame.size.height/2.0+75.0)) {
[self.tutorialView touchesBegan:touches withEvent:event];
}
}
}
}
Кроме того, я сделал это, чтобы передать штрихи к моей надтаблице:
self.tutorialHoleView.userInteractionEnabled = NO;
Удивительно, но это не работает вообще. Он не пропускает события крана, не говоря о событиях салфетки, которые мне тоже нужно передать. Итак, мой вопрос: как передать события касания через определенную зону в движущемся UIView? Возможно ли это?