Я создаю UIView и применяя маску на него таким образом:UIView с помощью метода pointInside
baseView = [[ViewTutorialSubclass alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
//self.view = baseView;
[self.view addSubview:baseView];
[baseView setBackgroundColor:[UIColor blackColor]];
baseView.userInteractionEnabled = YES;
baseView.alpha = 0.7;
mask = [[CAShapeLayer alloc] init];
mask.frame = baseView.layer.bounds;
CGRect biggerRect = CGRectMake(mask.frame.origin.x, mask.frame.origin.y, mask.frame.size.width, mask.frame.size.height);
CGRect smallerRect = CGRectMake(7.0f, 160.0f, 590.0f, 43.0f);
UIBezierPath *maskPath = [UIBezierPath bezierPath];
[maskPath moveToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMaxY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMaxY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath moveToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMaxY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMaxY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMinY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))];
mask.path = maskPath.CGPath;
[mask setFillRule:kCAFillRuleEvenOdd];
mask.fillColor = [[UIColor blackColor] CGColor];
baseView.layer.mask = mask;
В моей ViewTutorialSubclass.m у меня есть:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
for (UIView *v in self.subviews) {
CGPoint localPoint = [v convertPoint:point fromView:self];
if (v.alpha > 0.8 && [v pointInside:localPoint withEvent:event])
return YES;
}
return NO;
}
Идея заключается в том, что все пользовательские штрихи передаются в UIview ниже этого, если пользователь касается любой части UIview с помощью маски (настолько прозрачной), а если пользователь касается где-либо еще, касания применяются к этому текущему UIview. Как я могу это надеть? Является ли pointInside лучшим решением?
Ответ выглядит великолепно. Вы правильно поняли, я в какой-то момент удалю маску и добавлю другую с разными размерами, но я не могу понять ваш подход к проблеме. – Alessandro
Код, хотя работает отлично. Огромный ответ спасибо +1 – Alessandro
@Alessandro Код в dispatch_once создает контекст чертежа, поддерживаемый одноразрядным растровым изображением. В более позднем коде применяется преобразование в контекст растрового изображения, который указывает на начало координат и рисует маску в растровое изображение. Если точка находится в прозрачной маске, тогда прозрачный пиксель, {0, 0, 0, 0}, будет нарисован в начале координат. Если точка не в маске, в начале координат будет нарисован черный полный альфа-пиксель, {0, 0, 0, 255}. Растровые пиксели хранятся в bitmapData, а альфа-компонент - четвертый байт, bitmapData [3]. –