我正在尝试使用hitTest withEvent获取对在蒙版UIImageView下面的UImageView的引用。这是我不工作的东西:
UIView A包含3个UIImageViews作为子视图:panelOne,panelTwo和panelThree。panelThree占据了整个框架,但被遮盖成一个三角形,露出了面板1和面板2的一部分。因此,我需要检测用户何时在该矩形之外点击,并将触摸发送到适当的UIImageView。
代码:(CollagePanel是UIImageView的子类)
-(void)triangleInASquare
{
CGSize size = self.frame.size;
CollagePanel *panelOne = [[CollagePanel alloc] initWithFrame:CGRectMake(0,0, size.width/2, size.height)];
panelOne.panelScale = panelOne.frame.size.width/self.frame.size.width;
panelOne.backgroundColor = [UIColor greenColor];
CollagePanel *panelTwo = [[CollagePanel alloc] initWithFrame:CGRectMake(size.width/2,0, size.width/2, size.height)];
panelTwo.panelScale = panelOne.frame.size.width/self.frame.size.width;
panelTwo.backgroundColor = [UIColor purpleColor];
CollagePanel *panelThree = [[CollagePanel alloc] initWithFrame:CGRectMake(0,0, size.width, size.height)];
panelThree.backgroundColor = [UIColor orangeColor];
UIBezierPath* trianglePath = [UIBezierPath bezierPath];
[trianglePath moveToPoint:CGPointMake(0, panelThree.frame.size.height)];
[trianglePath addLineToPoint:CGPointMake(panelThree.frame.size.width/2,0)];
[trianglePath addLineToPoint:CGPointMake(panelThree.frame.size.width, panelTwo.frame.size.height)];
[trianglePath closePath];
// Mask the panels's layer to triangle.
CAShapeLayer *triangleMaskLayer = [CAShapeLayer layer];
[triangleMaskLayer setPath:trianglePath.CGPath];
triangleMaskLayer.strokeColor = [[UIColor whiteColor] CGColor];
panelThree.layer.mask = triangleMaskLayer;
//Add border
CAShapeLayer *borderLayer = [CAShapeLayer layer];
borderLayer.strokeColor = [[UIColor whiteColor] CGColor];
borderLayer.fillColor = [[UIColor clearColor] CGColor];
borderLayer.lineWidth = 6;
[borderLayer setPath:trianglePath.CGPath];
[panelThree.layer addSublayer:borderLayer];
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
[tempArray addObject:panelOne];
[tempArray addObject:panelTwo];
[tempArray addObject:panelThree];
[self addGestureRecognizersToPanelsInArray:tempArray];
[self addPanelsFromArray:tempArray];
self.panelArray = tempArray;
}
-(void)handleTap: (UITapGestureRecognizer*) recognizer //coming from panel.imageView
{
CGPoint tapPoint = [recognizer locationInView:self];
NSLog(@"Location in self: %@", NSStringFromCGPoint(tapPoint));
NSLog(@"self.subviews: %@", self.subviews);
UIView *bottomView = [self hitTest:tapPoint withEvent:nil];
NSLog(@"Bottom View: %@", bottomView);
}
bottomView的NSLog始终是panelThree(最上面的面板)。据我了解,命中测试应该返回“最底端”子视图。
你明白错了。它会返回将自己识别为被触摸并且最接近您的手指,更接近顶部的视图。
如果某个视图在某点上不能将自身识别为触摸,则需要覆盖
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
对于那个观点。
我认为Ole Begemann的“ Shapped Button”是一个很好的示例。
在您的项目中,此方法可以确定路径中是否存在点:CGPathContainsPoint
。
您pointInside:withEvent:
可能看起来像这样:
#import "CollagePanel.h"
#import <QuartzCore/QuartzCore.h>
@implementation CollagePanel
//
// ...
//
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
CGPoint p = [self convertPoint:point toView:[self superview]];
if(self.layer.mask){
if (CGPathContainsPoint([(CAShapeLayer *)self.layer.mask path], NULL, p, YES) )
return YES;
}else {
if(CGRectContainsPoint(self.layer.frame, p))
return YES;
}
return NO;
}
@end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句